【问题标题】:How to compare one character from a string with another string [duplicate]如何将字符串中的一个字符与另一个字符串进行比较[重复]
【发布时间】:2013-01-20 06:35:18
【问题描述】:

可能重复:
How do I compare strings in 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
}

【问题讨论】:

  • 我认为“在 Java 中将字符串转换为十六进制”可能很有用 (stackoverflow.com/questions/923863/…)
  • 你好@IgorK,我正在使用另一种方法将十六进制数字转换为十进制。

标签: java string hex decimal


【解决方案1】:

其实有一种非常简单优雅的做法:

int result = Integer.parseInt(hex, 16);

【讨论】:

  • 是的,这已经确定了,但它会破坏我练习的重点。我正在努力学习 Java 并提高我的技能。
【解决方案2】:

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

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

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

【讨论】:

  • 我现在已经发布了完整的方法,是的,我经常使用 Integer.valueOf()。
  • 那是你错误的根源。您可以按照上面的建议使用 Integer.valueOf(hex.charAt(i), 16) 简单地将每个数字转换为相应的 int 数,但是由于这会破坏您的练习代码的要点,您可能只想简单地包装其中的部分您使用 if 转换十进制数字以确保所述数字是有效的十进制数字 - 即 if ("0123456789abcdefABCDEF".contains(String.valueOf(hex.charAt(i))) { // 在此处进行数字转换 }
【解决方案3】:

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

希望对您有所帮助。 :)

【讨论】:

    【解决方案4】:

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

    如果你需要检查'b'和'B',那么在你的else中

    else if (current == 'b' || current == 'B') { }

    【讨论】:

    • 我已经按照 Kevin 的建议尝试过,但似乎没有用。它仍然只是说For input string: "b"
    • 你能把整个方法放在这里吗?
    • 我猜你是从 Integer.valueOf() 方法获得数字格式异常。尝试直接比较字符,例如:if(current == '0'),if(current == '1')就像那样。如果在里面将其转换为 int
    【解决方案5】:

    你需要用equals方法比较字符串

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

    您可以在此处找到更多详细信息:http://www.javabeginner.com/learn-java/java-string-comparison

    【讨论】:

      【解决方案6】:

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

      char current = hex.charAt(i);
      

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

      else if (current == 'b') 
      

      由于char 是一个原语,您可以使用== 运算符对其进行比较。在前面的代码中,您使用== 比较String,因为StringObject,因此代码检查它们是否相同Object,而不是它们是否具有与@ 相同的值987654332@方法会。

      【讨论】:

      • 这没有用,但确实应该。我开始认为我的代码现在可能还有其他问题。我应该将整个方法放在原始帖子中吗?
      • @Moka 是的,发布更多代码总是好的
      • @Moka 十六进制数字不都是大写的吗?你的条件是检查小写,我的也是。可能想让它像'B'
      • 我已经将输入转换为小写。你的回答真的很有帮助,非常感谢。
      • @moka 很高兴我能帮上忙
      猜你喜欢
      • 1970-01-01
      • 2020-09-03
      • 1970-01-01
      • 2017-06-30
      • 2016-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-02
      相关资源
      最近更新 更多