【问题标题】:Switch structure: entering a zip code to associate it with a geographic area but only returning the first digit?开关结构:输入邮政编码以将其与地理区域相关联,但只返回第一个数字?
【发布时间】:2013-11-29 19:51:23
【问题描述】:

首先,这是我想出的代码:

package decision;

import java.util.Scanner;
public class ZIP {

    public static void main(String[] args) {
        Scanner input=new Scanner (System.in);

    char zipCode;

        System.out.println("Enter your zip code number: ");
            zipCode=input.next().charAt(0);

            switch (zipCode) {
            case 0: case 2: case 3:
                System.out.println(zipCode + " is on the East Coast.");
                break;
            case 4: case 5: case 6: 
                System.out.println(zipCode + " is in the Central Plains Area.");
                break;
            case 7:
                System.out.println(zipCode + " is in the South.");
                break;
            case 8: case 9:
                System.out.println(zipCode + " is in the West.");
                break;
            default:
                System.out.println(zipCode + " is an invalid ZIP Code.");
            }
    }

}

(今天刚了解了 switch 结构,想知道当我的代码中充满了嵌套 if 的时候它们在哪里。)

基本上,这个程序应该只接受用户输入的邮政编码的第一个数字(他输入完整的 - 五位数字),但我希望控制台在输出期间打印邮政编码的所有五位数字。

例如,用户会输入87878。该程序将只接受第一个数字(即 8)以将其与特定区域相关联,但是当我将其打印出来时,我希望控制台打印:“(zipCode) is in the West.”

我尝试将 zipCode 的数据类型更改为 char,这样我就可以使用我最近才学到的 charAt(0) 方法,但是鉴于我提供的代码,控制台会打印出来:

Enter your zip code number: 
20098
2 is an invalid ZIP Code.

我可以做些什么来获得我想要的输出?提前致谢!

编辑: 这就是我希望控制台的样子:

Enter your zip code number: 
20098
20098 is on the East Coast.

【问题讨论】:

    标签: java char switch-statement zipcode


    【解决方案1】:

    问题在于,例如如果zipCode 等于'0',它的int 值实际上等于48 而不是0

    如果你这样做:

    char c = '0';
    System.out.println((int)c);
    

    你会看到它输出48。为什么?

    因为在 Java 中,char 数据类型是单个 16 位 Unicode 字符(参见下面的编码表)。

    如果您查看此表,您会发现 0 编码为 0x0030 = 3*16^1 = 48,1 编码为 0x0031 = 3*16^1 + 1*16^0 = 49

    为了避免这种情况:

    1. 将您的案例标签更改为case 48: case 50: case 51 (for 0,2,3) 等等
    2. 将您的案例标签更改为case '0': case '2': case '3' 等等。

    就个人而言,我会向您推荐第二种解决方案,它实际上更清晰和简单。

    Demo here.

    如果您想继续测试案例标签中的整数值,您可以这样做:

    int zipCode = Character.getNumericValue(input.next().charAt(0));
    

    编辑:

    要获得您想要的输出,您可以将用户的输入存储在 String 变量中。

        System.out.println("Enter your zip code number: ");
        String code = input.next();
        char zipCode = code.charAt(0);
    
            switch (zipCode) {
            case '0': case '2': case '3':
                System.out.println(code + " is on the East Coast.");
                break;
            /**/
            default:
                System.out.println(code + " is an invalid ZIP Code.");
            }
    

    【讨论】:

    • 其实问题不在于类型是char而不是int,而是'0'的int值不是0,而是48:char'0'的Unicode值。
    • @JBNizet 谢谢,做了澄清。
    • @ZouZou 谢谢!这说得通。你帮了大忙!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多