【问题标题】:How two numeric strings are compared in java [duplicate]java中如何比较两个数字字符串[重复]
【发布时间】:2017-08-05 12:43:53
【问题描述】:

非常愚蠢的问题,我不明白。 java比较数字字符串时,为什么“01”小于“1”?

阿什利

【问题讨论】:

  • 因为 '0'
  • 不知道你们为什么投反对票。我不想知道如何比较字符串。我只是想知道为什么一个字符串小于另一个字符串。就这样。请在投票前仔细阅读问题。

标签: java


【解决方案1】:

因为字符串比较(Comparable 实现)依赖于比较 Strings 的每个字符 unicode 值的 lexicographical 比较。

"1" (U+0031 unicode) 在"0" (U+0030 unicode) 之后根据 unicode 表。


它的工作方式与字典相同,与数字比较不同
你比较的是一些Strings,而不是一些Numbers。

"azerty""zip" 之前,因为"a""z" 之前

"1""01" 是一样的。
"0""1" 之前。所以"01" "1"。


可以参考String.compareTo()javadoc 更好的理解方法的契约。

【讨论】:

    【解决方案2】:

    因为"0" 小于"1"。字典比较是每个字符的字符,在第一个不同的字符处停止。

    这在String.compareTo中有详细描述:

    这是字典顺序的定义。如果两个字符串不同,则它们在某个索引处具有不同的字符,该索引是两个字符串的有效索引,或者它们的长度不同,或两者兼而有之。如果它们在一个或多个索引位置有不同的字符,则令 k 为最小的该索引;然后,在位置 k 处的字符具有较小值的字符串(通过使用< 运算符确定)按字典顺序位于另一个字符串之前。在这种情况下,compareTo 返回两个字符串中位置 k 处的两个字符值的差值——即值:

    this.charAt(k)-anotherString.charAt(k)
    

    如果它们没有不同的索引位置,则较短的字符串按字典顺序位于较长的字符串之前。在这种情况下,compareTo 返回字符串长度的差值——即值:

    this.length()-anotherString.length()
    

    【讨论】:

      【解决方案3】:

      假设你想比较两个字符串的数值,它们都是整数:

      Integer.parseInt("0") < Integer.parseInt("01")
      

      【讨论】:

        【解决方案4】:

        由语言环境决定如何比较字符串。对于西方语言,你有一个简单的字符顺序,你从左边开始。这里最左边的字符分别是“0”和“1”,“0”的unicode值低于“1”,这立即决定以“0”开头的字符串在以“1”开头的字符串之前。

        字符串意外地与其他内容相似(例如一个字符一个字符的整数)与此机制无关。如果它与您需要解决的任务相关,您需要编写代码来考虑这一点。

        【讨论】:

          猜你喜欢
          • 2012-06-19
          • 1970-01-01
          • 1970-01-01
          • 2012-02-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-26
          相关资源
          最近更新 更多