Java中的compareTo()
方法返回一个大于/等于/小于0的值,我就知道了。但是,价值本身就是我的问题。当compareTo()
返回时,2或4之间有什么区别。请看下面的代码
String s1="hello";
String s2="hello";
String s3="meklo";
String s4="hemlo";
System.out.println(s1.compareTo(s2)); // 0
System.out.println(s1.compareTo(s3)); // -5
System.out.println(s1.compareTo(s4)); // -1
为什么最后两个命令是-5和-1?
答案 0 :(得分:7)
https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#compareTo(java.lang.String)
这是词典排序的定义。如果两个字符串不同,则它们在某个索引处具有不同的字符,这两个字符串是两个字符串的有效索引,或者它们的长度不同,或两者都有。如果它们在一个或多个索引位置具有不同的字符,则令k为最小的索引;然后,通过使用<来确定位置k处的字符具有较小值的字符串。运算符,按字典顺序排在另一个字符串之前。在这种情况下,compareTo返回两个字符串中位置k处两个字符值的差值 - 即值:
this.charAt(k)的-anotherString.charAt(k)的
如果没有它们不同的索引位置,那么较短的字符串按字典顺序排在较长的字符串之前。在这种情况下,compareTo返回字符串长度的差异 - 即值:
this.length()处 - anotherString.length()
答案 1 :(得分:4)
compareTo()
返回两个比较字符串中第一个不匹配字符的差异。如果没有找到匹配,并且一个字符串比其他字符串短,则返回长度差异。
"hello".compareTo("meklo") = 'h' - 'm' = -5
^ ^
and
"hello".compareTo("hemlo") = 'l' - 'm' = -1
^ ^
作为旁注:
在条件语句中,非零值通常被视为true
。因此,compareTo
可以简单地返回这些非零值,而不是将它们处理为1
(小优化)。
答案 2 :(得分:0)
如果仔细查看<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="sections" id="section1"></div>
<div class="sections" id="section2"></div>
<div class="sections" id="section3"></div>
<div class="sections" id="section4"></div>
<div class="sections" id="section5"></div>
的源代码,可以看到确切的结果不明确。
String#compareTo(String)
在大多数情况下(即两个字符串的字符不同),它将返回第一个不同字符的char值的整数差异。否则它将返回两个字符串长度的差异。
对public int compareTo(String anotherString) {
int len1 = value.length;
int len2 = anotherString.value.length;
int lim = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value;
int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
return len1 - len2;
}
,= 0
和> 0
之外的返回值的解释在实践中应该无关紧要,因为如果{的合同允许实施,则可以随时更改保留{1}}:
将此对象与指定的订单对象进行比较。返回负整数,零或正整数,因为此对象小于,等于或大于指定对象。
来源:https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html#compareTo-T-
答案 3 :(得分:0)
确切的值无关紧要 - Comparable
(以及Comparator
)接口关心的是值是负,零还是正。
这是为了简化界面的实现。在实现它时,您可以选择返回基本的-1,0或1(如果比较依赖于评估某些条件,这通常是这种情况),或者如果它更适合您,您可以使用任意负值或正值 - 例如您可以通过返回this.i - other.i
来比较两个整数。
在您的特定示例中,我的猜测是:
-1
与第三个字母的代码点不同:'l' - 'm' == -1
-5
与第一个字母的代码点不同:'h' - 'm' == -5
但重要的是,你不应该依赖它 - 这是一个实施细节,根据Comparable
的合同,任何负面价值都应该被视为相同(&#34;小于&#34;)。