Java中的比较器问题
我在Java项目中使用以下代码按字符串长度排序:Java中的比较器问题,java,arrays,sorting,comparator,Java,Arrays,Sorting,Comparator,我在Java项目中使用以下代码按字符串长度排序: SortedMap<String, String> values = new TreeMap<String, String>(new Comparator<String>() { public int compare(String s1, String s2) { return s2.length() - s1.length(); } });
SortedMap<String, String> values =
new TreeMap<String, String>(new Comparator<String>() {
public int compare(String s1, String s2) {
return s2.length() - s1.length();
}
});
但是,它只返回两个值:
{bb=45, a=6}
我想知道为什么?谁能给我解释一下或者修理一下吗?Thx.比较器决定对象是否相等。您的实现使c等于a,因为它们的长度都是1
因此,6值替换了4值,并且键保持不变
要解决此问题,您需要在比较器中以某种方式区分c和a值,以便a和c的比较不相等,即在本例中不返回0。a和c的大小相同,因此对于比较器,它们是相同的。您需要重写比较器对于长度相等的字符串,比较器返回0,这被定义为两个相同对象的值,即a.compareTob==0相当于a.equalsb==true。这就是密钥c覆盖密钥a的原因
您要做的是指定一些辅助排序标准,例如:
public int compare(String s1, String s2) {
int lengthComparison = s2.length() - s1.length();
if (lengthComparison != 0) {
return lengthComparison;
}
return s1.compareTo(s2);
}
这确保仅当字符串确实完全相同时才返回0。相同大小的字符串现在按词汇排序。请阅读java文档进行比较。。。0表示等于。。。a和c的大小是一样的。。。所以它返回0。@DeerMichel阅读了关于什么是比较器的内容。你想要实现什么?您不是在比较字符串…Java API for TreeMap状态,它构造了一个新的空树映射,并根据给定的比较器排序。。并没有提到比较器也用于检查相等性。实际上,您需要查看提到这一点的比较器:当使用比较器时,应该注意,比较器能够对排序集或排序映射施加与等于不一致的排序。
public int compare(String s1, String s2) {
int lengthComparison = s2.length() - s1.length();
if (lengthComparison != 0) {
return lengthComparison;
}
return s1.compareTo(s2);
}