【发布时间】:2017-08-05 12:43:53
【问题描述】:
非常愚蠢的问题,我不明白。 java比较数字字符串时,为什么“01”小于“1”?
阿什利
【问题讨论】:
-
因为 '0'
-
不知道你们为什么投反对票。我不想知道如何比较字符串。我只是想知道为什么一个字符串小于另一个字符串。就这样。请在投票前仔细阅读问题。
标签: java
非常愚蠢的问题,我不明白。 java比较数字字符串时,为什么“01”小于“1”?
阿什利
【问题讨论】:
标签: java
因为字符串比较(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 更好的理解方法的契约。
【讨论】:
因为"0" 小于"1"。字典比较是每个字符的字符,在第一个不同的字符处停止。
这在String.compareTo中有详细描述:
这是字典顺序的定义。如果两个字符串不同,则它们在某个索引处具有不同的字符,该索引是两个字符串的有效索引,或者它们的长度不同,或两者兼而有之。如果它们在一个或多个索引位置有不同的字符,则令 k 为最小的该索引;然后,在位置 k 处的字符具有较小值的字符串(通过使用
<运算符确定)按字典顺序位于另一个字符串之前。在这种情况下,compareTo返回两个字符串中位置 k 处的两个字符值的差值——即值:this.charAt(k)-anotherString.charAt(k)如果它们没有不同的索引位置,则较短的字符串按字典顺序位于较长的字符串之前。在这种情况下,
compareTo返回字符串长度的差值——即值:this.length()-anotherString.length()
【讨论】:
假设你想比较两个字符串的数值,它们都是整数:
Integer.parseInt("0") < Integer.parseInt("01")
【讨论】:
由语言环境决定如何比较字符串。对于西方语言,你有一个简单的字符顺序,你从左边开始。这里最左边的字符分别是“0”和“1”,“0”的unicode值低于“1”,这立即决定以“0”开头的字符串在以“1”开头的字符串之前。
字符串意外地与其他内容相似(例如一个字符一个字符的整数)与此机制无关。如果它与您需要解决的任务相关,您需要编写代码来考虑这一点。
【讨论】: