解决switch……case不能匹配字符串的方法

本文探讨了在编程中使用switch-case语句相较于if-else语句在处理大量数据时的效率优势,并提供了如何利用HashMap提高代码可读性的示例。此外,还展示了如何通过嵌套switch-case来解决复杂条件判断问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以前写代码的时候,没有考虑到效率的问题。if……else if……else if 写了老长。如果数据量特别大的话,其实会影响到程序的效率。因为,if语句是从上到下一个个判断的,直到条件为真才退出。而switch……case 则不是从上到下进行验证的,因此效率要比if else高。

 

可惜的是,switch case 不支持字符串,着实让我伤脑筋。今天在网上查了些资料,得到一些提示,拿出来晒晒。

 

if……else例子:

 

 public void  ifElse(){


       String name="haha";
       if(name.equals("yes")){
        System.out.println("is yes");
       }
       else if(name.equals("hello")){
        System.out.println("is hello");
       }
       else if(name.equals("in")){
        System.out.println("is in");
       }
       else if(name.equals("haha")){
        System.out.println("is haha");
       }
 }

 

代码难看,如果if 再长一点,就难受了。

 

用switch case 实现:

 

 public void switchCaseStr() {
  
  Map<String,Integer> map=new HashMap<String, Integer>();
  
  map.put("hello", 1);
  map.put("haha", 2);
  map.put("yes", 3);
  map.put("in", 4);
  
 
  String str="hello";
  
  switch(map.get(str))
  {    
   case 3:
        System.out.println("yes");
       break;
   case 1:
        System.out.println("hello");
        break;
    case 2:
        System.out.println("haha");
       break;
    case 4:
       System.out.println("in");
       break;
  
   default:
    System.out.println("default");
  }
 }

 

     不仅从效率上有提高,而且代码也更好看。当然,switch case 还可以嵌套使用。

 

   public void switchCaseStr(){

 

  Map<String,Integer> map=new HashMap<String, Integer>();
  
  map.put("hello", 1);
  map.put("haha", 2);
  map.put("yes", 3);
  map.put("in", 4);
  
 
  String str="hello";
  
  switch(map.get(str))
  {    
   case 3:
    System.out.println("yes");
    break;
   case 1:
    System.out.println("hello");
    
    String st="in";
    switch(map.get(st))
    {
    case 2:
     System.out.println("haha");
     break;
    case 4:
     System.out.println("in");
     break;
    }
    break;
   default:
    System.out.println("default");
  }

 

 

}

 

     当然,也可以有其它的方法实现。本人喜欢用hashmap,效率应该比 List好一点吧,个人觉得。

<think>好的,我现在需要解决用户的问题:编写一个Java程序,使用switch语句实现分数和等级之间的双向转换。当输入分数时输出对应的等级,输入等级时输出对应的分数。用户还提供了一个大致的代码结构,我需要在这个基础上完善。 首先,我要明确需求。程序需要有两个功能选项,用户选择1时输入等级输出分数,选择2时输入分数输出等级。分数和等级的对应关系是: - [90,100]:A - [80,90):B - [60,80):C - [0,60):D 接下来,我需要考虑如何用switch语句处理这两个case。对于case 1,用户输入等级(比如A),程序需要输出对应的分数范围。这里可能需要处理字符串输入,所以要注意使用Scanner的next()方法读取字符串,然后判断等级,输出对应的分数段。 对于case 2,用户输入分数,需要判断属于哪个等级。这里需要注意的是分数是整数还是浮点数?根据题目中的例子,比如[80~90),可能是指整数,所以可以读取整数,然后使用if-else判断区间,但用户希望用switch语句处理。然而,switch在Java中支持范围判断,所以可能需要将分数除以10,转换为case来处理。例如,分数90-100对应除以10后是9或10,得到A;80-89对应8,得到B;60-79对应6或7,得到C;0-59对应其他情况,得到D。但要注意处理边界值,比如90是否属于A,这里题目明确[90,100]是A,所以90是包含在内的。所以当分数为90时,除以10是9,属于case 9或10。 但这里有个问题,case 2的处理如果用switch,可能需要将分数转换为十位数,比如: int score = sc.nextInt(); int ten = score / 10; switch(ten) { case 10: case 9: System.out.println("A"); break; case 8: System.out.println("B"); break; case 7: case 6: System.out.println("C"); break; default: if (score >=0 && score <60) { System.out.println("D"); } else { System.out.println("输入错误"); } } 但这里需要注意,当score是100时,ten是10,属于A。而如果是负数的话,需要处理错误。但题目中的分数范围是0到100,所以可能需要先判断输入是否有效。 过用户提供的代码结构中的case 2部分可能需要用switch,但传统的switch处理范围比较麻烦,所以可能需要结合if-else。过用户特别要求用switch语句处理,所以可能需要用上述方法。 对于case 1,输入等级,比如A,B等,这里需要用switch处理字符,比如: String grade = sc.next(); switch(grade) { case "A": System.out.println("90~100"); break; case "B": System.out.println("80~89"); break; case "C": System.out.println("60~79"); break; case "D": System.out.println("0~59"); break; default: System.out.println("输入错误"); } 但要注意,题目中的等级对应的分数区间,比如B是[80,90),即80到89分,所以输出应该是80~89。而A是90到100,所以输出90~100。 现在需要将这些逻辑整合到用户提供的代码框架中。用户提供的代码结构中有两个casecase 1和case 2,分别处理等级到分数和分数到等级。 需要注意的问题: 1. 输入等级时,用户可能输入小写字母,比如a,是否需要转换?题目中没有说明,可能假设用户输入大写,所以程序中需要处理或者提示。但根据题目示例,应该要求用户输入大写,否则会报错。或者程序中将输入转换为大写,比如使用grade.toUpperCase(),但Java中字符串比较是区分大小写的,所以如果用户输入小写,就会匹配。所以可能需要先转换,或者在case中处理所有情况。比如: String grade = sc.next().toUpperCase(); switch(grade) { ... } 这样无论用户输入大小写,都能处理。 但原题中用户可能没有考虑这一点,所以是否需要处理?可能需要根据用户需求,但题目中没有说明,所以可能按照原题中的示例,假设用户输入正确的等级。 2. 处理分数时,输入是否为整数?题目中的例子都是整数范围,所以可能读取整数。如果用户输入小数,比如85.5,程序会报错,因为用的是nextInt()。所以需要明确输入分数是整数。 接下来,编写代码: 在case 1中,读取等级,然后输出分数范围; 在case 2中,读取分数,然后判断等级,这里需要用switch,将分数转换为十位数,但需要注意: 分数为100时,ten=10,属于A; 分数90-99,ten=9或10(但100的情况已经被处理),所以case 9和10都输出A; 分数80-89,ten=8,B; 分数60-79,ten=6或7,C; 分数0-59,ten=0到5,或者其他情况,比如负数,需要处理错误。 但根据题目,分数范围是0到100,所以需要先判断输入是否在0-100之间,否则输出错误。 所以case 2的处理逻辑可能是: 输入分数,如果在0-100,输出错误; 否则,用switch处理十位数: int score = sc.nextInt(); if (score <0 || score >100) { System.out.println("输入错误"); } else { int ten = score /10; switch(ten) { case 10: case 9: System.out.println("A"); break; case 8: System.out.println("B"); break; case 7: case 6: System.out.println("C"); break; default: if (score >=0) { System.out.println("D"); } else { System.out.println("输入错误"); } } } 但是这里,当ten是5或以下时,比如59,ten=5,进入default,此时判断score>=0,所以输出D。负数已经被前面的if过滤了。 现在将整个代码整合: import java.util.Scanner; public class Grade_Score { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("1、输入等级输出分数"); System.out.println("2、输入分数输出等级"); System.out.println("请选择菜单号:"); int choice = sc.nextInt(); switch(choice) { case 1: System.out.println("请输入等级(A/B/C/D):"); String grade = sc.next().toUpperCase(); // 转换为大写,处理小写输入 switch(grade) { case "A": System.out.println("90~100"); break; case "B": System.out.println("80~89"); break; case "C": System.out.println("60~79"); break; case "D": System.out.println("0~59"); break; default: System.out.println("输入错误!等级只能是A/B/C/D"); } break; case 2: System.out.println("请输入分数(0-100):"); int score = sc.nextInt(); if (score <0 || score >100) { System.out.println("输入错误!分数必须在0-100之间"); } else { int ten = score /10; switch(ten) { case 10: case 9: System.out.println("A"); break; case 8: System.out.println("B"); break; case 7: case 6: System.out.println("C"); break; default: // 0-5 System.out.println("D"); } } break; default: System.out.println("选择错误!"); } sc.close(); } } 这样处理的话,case 1中允许用户输入大小写的等级,转换为大写后匹配case 2中处理分数,先检查范围,然后用十位数来判断等级。 需要注意的问题: - 在case 1中,输入等级时,如果用户输入的是多个字符或者其他字符,程序会提示错误。 - 在case 2中,分数的处理是否正确,例如: 输入90,ten=9,属于A; 输入89,ten=8,属于B; 输入79,ten=7,属于C; 输入59,ten=5,进入default,输出D; 输入60,ten=6,输出C; 输入80,ten=8,输出B; 输入0,ten=0,输出D; 这些情况都符合题目要求。 现在,确认是否满足用户的所有要求,包括使用switch语句处理,结构正确,语法正确。</think>以下是实现分数与等级双向转换的Java程序,使用switch语句处理选择逻辑: ```java import java.util.Scanner; public class Grade_Score { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("1、输入等级输出分数"); System.out.println("2、输入分数输出等级"); System.out.print("请选择菜单号:"); int choice = sc.nextInt(); switch (choice) { case 1: System.out.print("请输入等级(A/B/C/D):"); String grade = sc.next().toUpperCase(); switch (grade) { case "A" -> System.out.println("对应分数范围:90~100"); case "B" -> System.out.println("对应分数范围:80~89"); case "C" -> System.out.println("对应分数范围:60~79"); case "D" -> System.out.println("对应分数范围:0~59"); default -> System.out.println("等级输入错误!"); } break; case 2: System.out.print("请输入分数(0-100):"); int score = sc.nextInt(); if (score < 0 || score > 100) { System.out.println("分数输入错误!"); } else { switch (score / 10) { case 10, 9 -> System.out.println("对应等级:A"); case 8 -> System.out.println("对应等级:B"); case 7, 6 -> System.out.println("对应等级:C"); default -> System.out.println("对应等级:D"); } } break; default: System.out.println("选择错误!"); } sc.close(); } } ``` ### 程序说明 1. **菜单选择** - 用户输入`1`选择「等级转分数」模式 - 用户输入`2`选择「分数转等级」模式 - 其他输入会提示「选择错误」 2. **等级转分数逻辑** - 输入等级(A/B/C/D),**区分大小写** - 通过嵌套switch语句匹配对应分数范围 - 示例:输入`B`会输出`80~89` 3. **分数转等级逻辑** - 输入0-100之间的整数 - 通过`score/10`将分数转换为十位数 - 使用switch语句匹配区间: - `90-100` → `A` - `80-89` → `B` - `60-79` → `C` - `0-59` → `D` ### 运行示例 ``` 1、输入等级输出分数 2、输入分数输出等级 请选择菜单号:1 请输入等级(A/B/C/D):b 对应分数范围:80~89 1、输入等级输出分数 2、输入分数输出等级 请选择菜单号:2 请输入分数(0-100):85 对应等级:B ```
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值