比较不同情况时 compareTo 的用处
Usefulness of compareTo when comparing different case
String
class实现了Comparable
接口,可以看出结果是两个字符串的字典序差异,有道理:
String s1 = "AB";
String s2 = "AF";
System.out.println(s1.compareTo(s2));
将输出 -4
,而如果我们切换参数输出 4
.
不明白的是比较不同大小写的字符串,即:
String s1 = "Ac";
String s2 = "AD";
System.out.println(s1.compareTo(s2));
这将输出 31
它只是根据 ASCII table 告诉我字符串中前两个不同字符之间的差异,它告诉我 "Ac"
大于 "AD"
来自 31
.
现在,我知道这可以通过自定义比较器轻松解决,无论如何我看不出默认比较器给出的结果有什么用,它的目的是什么?
当我比较字符串时,我通常只想知道它们是否相等,如果一个比另一个大,无论它们是大写还是小写,我通常只想知道它们是否相等,默认情况下比较不区分大小写不是更好吗?
默认区分大小写的比较器 如果您恰好想要这种行为,那么它很有用:两个字符串之间区分大小写的比较。事实上,Ac
在字典序上比 AD
大。如果要不区分大小写的比较,则使用String#compareToIgnoreCase
,例如:
String s1 = "Ac";
String s2 = "AD";
System.out.println(s1.compareToIgnoreCase(s2)); // -1 => Ac < AD, ignoring case
就 Comparable
的合同而言,compareTo
返回的实际数字并不重要。不是为了“有用”,而是为了它的标志。
唯一相关的是该值与零的比较方式(> 0
、== 0
、< 0
)。换句话说,不要指望实际返回的数字,它可能会随着实现版本而改变(不违反合同)。老实说,如果我发现自己使用的是 Comparable 合约之外的返回值,我肯定会闻到代码的味道。
如果你想要始终相同的数字,你可以使用结果的符号:
System.out.println(Math.signum(s1.compareTo(s2))) //cast if needed
根据结果总是会产生-1.0
、0.0
或1.0
,您可以放心。
String
class实现了Comparable
接口,可以看出结果是两个字符串的字典序差异,有道理:
String s1 = "AB";
String s2 = "AF";
System.out.println(s1.compareTo(s2));
将输出 -4
,而如果我们切换参数输出 4
.
不明白的是比较不同大小写的字符串,即:
String s1 = "Ac";
String s2 = "AD";
System.out.println(s1.compareTo(s2));
这将输出 31
它只是根据 ASCII table 告诉我字符串中前两个不同字符之间的差异,它告诉我 "Ac"
大于 "AD"
来自 31
.
现在,我知道这可以通过自定义比较器轻松解决,无论如何我看不出默认比较器给出的结果有什么用,它的目的是什么?
当我比较字符串时,我通常只想知道它们是否相等,如果一个比另一个大,无论它们是大写还是小写,我通常只想知道它们是否相等,默认情况下比较不区分大小写不是更好吗?
默认区分大小写的比较器 如果您恰好想要这种行为,那么它很有用:两个字符串之间区分大小写的比较。事实上,Ac
在字典序上比 AD
大。如果要不区分大小写的比较,则使用String#compareToIgnoreCase
,例如:
String s1 = "Ac";
String s2 = "AD";
System.out.println(s1.compareToIgnoreCase(s2)); // -1 => Ac < AD, ignoring case
就 Comparable
的合同而言,compareTo
返回的实际数字并不重要。不是为了“有用”,而是为了它的标志。
唯一相关的是该值与零的比较方式(> 0
、== 0
、< 0
)。换句话说,不要指望实际返回的数字,它可能会随着实现版本而改变(不违反合同)。老实说,如果我发现自己使用的是 Comparable 合约之外的返回值,我肯定会闻到代码的味道。
如果你想要始终相同的数字,你可以使用结果的符号:
System.out.println(Math.signum(s1.compareTo(s2))) //cast if needed
根据结果总是会产生-1.0
、0.0
或1.0
,您可以放心。