【问题标题】:Java .charAt(i) comparison issueJava .charAt(i) 比较问题
【发布时间】:2011-05-09 14:29:50
【问题描述】:

为什么当比较一个字符和另一个字符时,它也必须取自一个字符串?例如;

这不起作用

   while(i < t.length() && zeroCount < 5) {
        if(t.charAt(i) == 0){
            zeroCount++;
        }
        i++;
    }

也没有

char zero = 0;

      while(i < t.length() && zeroCount < 5) {
            if(t.charAt(i) == zero){
                zeroCount++;
            }
            i++;
        }

我设法让它工作的唯一方法是这样......

String zeros = "0000000000";

      while(i < t.length() && zeroCount < 5) {
            if(t.charAt(i) == zeros.charAt(i)){
                zeroCount++;
            }
            i++;
        }

谁能解释我做错了什么,或者像前两个例子那样做是不可接受的。如果有,为什么?

【问题讨论】:

    标签: java string comparison char


    【解决方案1】:

    你很困惑

    char zero = 0;
    

    char zero = '0';
    

    前者是空字符(ASCII 值为零),而后者是表示数字零的字符。

    这种混乱是 C 的一个相当不幸的遗留问题,char 变量被视为数字和字符。

    【讨论】:

      【解决方案2】:

      您在寻找字符“0”吗?然后比较'0',而不是0。

      【讨论】:

        【解决方案3】:

        您正在与 Unicode 值 0(又名 U+0000,“null”字符)进行比较 - 这与 Unicode 字符表示数字 0 不同。

        使用“0”而不是 0:

        while(i < t.length() && zeroCount < 5) {
            if(t.charAt(i) == '0'){
                zeroCount++;
            }
            i++;
        }
        

        【讨论】:

        • 我不愿意告诉人们使用 charAt:它被设计破坏了。
        【解决方案4】:

        使用“0”而不是 0。

        【讨论】:

          【解决方案5】:

          简单的答案是值0 与字符'0' 不同,后者的ASCII 码为48 (IIRC)。

          您应该将它与char值charAt(i) == '0'进行比较或在比较之前减去char charAt(i) - '0' == 0

          【讨论】:

          • 我认为你不应该告诉人们使用破旧的charAt 方法。问题太多了。
          【解决方案6】:

          这些其他答案是正确的,但是您应该知道一件非常重要的事情。你永远不应该使用chatAt!您应该只使用codePointAt

          同样,您也不能盲目地使用i++ 来撞击字符串。你需要看看s.codePointAt(i) &gt; Character.MAX_VALUE是否要额外给i++踢球。

          例如,以标准“U+”表示法打印出String s 中的所有代码点:

          private static void say_U_contents(String s) { 
              System.out.print("U+");
              for (int i = 0; i < s.length(); i++) {
                  System.out.printf("%X", s.codePointAt(i));
                  if (s.codePointAt(i) > Character.MAX_VALUE) { i++; }  // UG!
                  if (i+1 < s.length()) { System.out.printf("."); }
              }
          }
          

          这样你就可以为相应的字符串输出U+61.DFU+3C3U+1F4A9.1F4A9。最后一个看起来像"\uD83D\uDCA9\uD83D\uDCA9",简直是疯了。

          【讨论】:

          • 您的回答让不了解字符集的人感到困惑。对于查找0(或任何BMP 字符),charAt 没有任何问题,或者您的意思是什么问题?
          • @Ishtar:我遇到的问题是字符数会被关闭。像 "\uD83D\uDCA9\uD83D\uDCA9\u0000\uD83D\uDCA9\uD83D\uDCA9" 这样的东西只有 5 个代码点,其中 NUL 位于第 3 位。这就是 Java 模式 ^.....$ 匹配它的原因:因为 Pattern 类总是处理逻辑单元,这是正确的。
          猜你喜欢
          • 2017-02-26
          • 2019-02-20
          • 2021-11-18
          • 2018-07-07
          • 2021-02-01
          • 1970-01-01
          • 2013-08-10
          • 2020-02-05
          • 1970-01-01
          相关资源
          最近更新 更多