Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的比较器问题_Java_Arrays_Sorting_Comparator - Fatal编程技术网

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(); } });

我在Java项目中使用以下代码按字符串长度排序:

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);
}