3

可能重复:
如何比较 Java 中的字符串?

我对Java相当陌生,为了练习,我正在尝试创建一个十六进制到十进制数字转换器,因为我已经成功地制作了一个二进制到十进制转换器。

我遇到的问题基本上是将字符串中的给定字符与另一个字符串进行比较。这就是我定义要比较的当前字符的方式:

String current = String.valueOf(hex.charAt(i));

这就是我尝试比较角色的方式:

else if (current == "b") 
   dec += 10 * (int)Math.pow(16, power);

当我尝试通过仅输入数字(例如 12)来运行代码时,它可以工作,但是当我尝试使用“b”时,我得到了一个奇怪的错误。这是运行程序的整个结果:

run:
Hello! Please enter a hexadecimal number.
2b
For input string: "b" // this is the weird error I don't understand
BUILD SUCCESSFUL (total time: 1 second)

这是一个仅通过数字转换成功运行程序的示例:

run:
Hello! Please enter a hexadecimal number.
22
22 in decimal: 34 // works fine
BUILD SUCCESSFUL (total time: 3 seconds)

对此的任何帮助将不胜感激,谢谢。

编辑:我认为如果我把整个方法放在这里会很有用。

编辑 2:已解决!我不知道我应该接受谁的回答,因为他们都很好而且乐于助人。好矛盾啊

for (int i = hex.length() - 1; i >= 0; i--) {
        String lowercaseHex = hex.toLowerCase();
        char currentChar = lowercaseHex.charAt(i);

        // if numbers, multiply them by 16^current power
        if (currentChar == '0' || 
                currentChar == '1' || 
                currentChar == '2' || 
                currentChar == '3' || 
                currentChar == '4' || 
                currentChar == '5' || 
                currentChar == '6' || 
                currentChar == '7' || 
                currentChar == '8' || 
                currentChar == '9')
            // turn each number into a string then an integer, then multiply it by
            // 16 to the current power.
            dec += Integer.valueOf(String.valueOf((currentChar))) * (int)Math.pow(16, power);

        // check for letters and multiply their values by 16^current power
        else if (currentChar == 'a') 
            dec += 10 * (int)Math.pow(16, power);
        else if (currentChar == 'b') 
            dec += 11 * (int)Math.pow(16, power);
        else if (currentChar == 'c') 
            dec += 12 * (int)Math.pow(16, power);
        else if (currentChar == 'd') 
            dec += 13 * (int)Math.pow(16, power);
        else if (currentChar == 'e') 
            dec += 14 * (int)Math.pow(16, power);
        else if (currentChar == 'f') 
            dec += 15 * (int)Math.pow(16, power);
        else
            return 0;
        power++; // increment the power
    }

    return dec; // return decimal form
}
4

6 回答 6

11

尝试将 char 初始化为char返回的值charAt()

char current = hex.charAt(i);

然后在您的条件中使用文字字符:

else if (current == 'b') 

由于char它是一个原语,您可以使用==运算符对其进行比较。在前面的代码中,您正在比较 a Stringusing ==,因为 aString是 anObject代码正在检查它们是否相同,Object而不是它们是否具有与方法相同的值String.equals()

于 2013-02-05T10:54:06.087 回答
1

没有完整的代码很难确定,但“for input string:xx”形式通常是与 NumberFormatException 关联的消息。您是否偶然使用 Integer.valueOf()、Integer.parseInt() 或类似方法将字符串(部分)转换为数字?

如果是这种情况,为了让他们接受一个十六进制数字 (af),您需要通过调用接受基数第二个参数的方法来明确声明您正在传递一个 16 进制数字 - 例如 Integer.valueOf(字符串,16)。

此外,正如其他人已经指出的那样,比较字符串的正确方法是使用 equals 方法,因为 == 运算符仅在两个引用指向完全相同的对象时才返回 true,而不管其值(内容)如何。

于 2013-02-05T11:23:53.217 回答
0

您需要使用 equals 方法比较字符串

else if ("b".equals(current)) 

你可以在这里找到更多细节:http ://www.javabeginner.com/learn-java/java-string-comparison

于 2013-02-05T10:54:10.267 回答
0

将您的字符串更改为 char。char 当前 = hex.charAt(i);

然后在你的 else 如果你需要检查'b'和'B'

否则 if (current == 'b' || current == 'B') { }

于 2013-02-05T10:58:09.333 回答
0

使用 .equals() 比较字符串。当您使用 == 时,我认为它会检查它们是否都引用相同的东西。

希望有帮助。:)

于 2013-02-05T10:58:40.940 回答
0

实际上,有一种非常简单而优雅的方法:

int result = Integer.parseInt(hex, 16);
于 2013-02-05T12:34:01.337 回答