Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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_Sorting_Dictionary_Collections_Compare - Fatal编程技术网

Java 按值大小对映射进行排序

Java 按值大小对映射进行排序,java,sorting,dictionary,collections,compare,Java,Sorting,Dictionary,Collections,Compare,我有一个简单的比较方法,可以根据值的大小对Map进行排序 public List<Entry<String, HashSet<String>>> orderByDescStringSetSize(HashMap<String, HashSet<String>> map){ Set<Entry<String, HashSet<String>>> set = map.entrySet();

我有一个简单的比较方法,可以根据值的大小对
Map
进行排序

public List<Entry<String, HashSet<String>>> orderByDescStringSetSize(HashMap<String, HashSet<String>> map){
    Set<Entry<String, HashSet<String>>> set = map.entrySet();
    List<Entry<String, HashSet<String>>> list = new ArrayList<Entry<String, HashSet<String>>>(set);

    Collections.sort(list, new Comparator<Map.Entry<String, HashSet<String>>>(){
        public int compare(Map.Entry<String, HashSet<String>> o1, Map.Entry<String, HashSet<String>> o2){

            Integer o1Vals = o1.getValue().size();
            Integer o2Vals = o2.getValue().size();

            //descending
            if(o2Vals > o1Vals)
                return 1;
            else if(o2Vals==o1Vals)
                return 0;
            else
                return -1;

        }
    });
    return list;
}
公共列表orderByDescStringSetSize(HashMap映射){ Set=map.entrySet(); 列表=新的ArrayList(集合); Collections.sort(list,newcomparator(){ 公共整数比较(Map.Entry o1,Map.Entry o2){ 整数O1VAL=o1.getValue().size(); 整数O2VAL=o2.getValue().size(); //下降的 如果(O2VAL>O1VAL) 返回1; 否则如果(O2VAL==O1VAL) 返回0; 其他的 返回-1; } }); 退货清单; }
我得到
java.lang.IllegalArgumentException:比较方法违反了它的一般约定
!为什么会这样?

这是因为
O2VAL==O1VAL
并没有达到您的预期

您正在使用
整数
对象-请使用
等于


这可能不是唯一的问题。

这是因为
O2VAL==O1VAL
没有达到您期望的效果

您正在使用
整数
对象-请使用
等于


这可能不是唯一的问题。

使用与您相同的方法,我将修改:

  • hashset
    的大小是一个
    int
    ,用于比较,而不是
    整数
  • 如果返回值,则无需添加
    if-else if-else
    。此外,您可以只返回减法后的值:
    returno2vals-o1Vals
  • 您在某些点和地图中使用了
    Entry
    。Entry
    ,您确定导入正确吗?在任何情况下,我建议您始终使用其中一种,以确保类型相同
也就是说,解决方案应该如下所示:

public List<Entry<String, HashSet<String>>> orderByDescStringSetSize2(HashMap<String, HashSet<String>> map) {
    Set<Entry<String, HashSet<String>>> set = map.entrySet();
    List<Entry<String, HashSet<String>>> list = new ArrayList<>(set);

    Collections.sort(list, new Comparator<Entry<String, HashSet<String>>>() {

    @Override
    public int compare(Entry<String, HashSet<String>> o1, Entry<String, HashSet<String>> o2) {
        int o1Vals = o1.getValue().size();
        int o2Vals = o2.getValue().size();

        // Descending
        return o2Vals - o1Vals;
    }
    });
    return list;
}

使用与您相同的方法,我将修改:

  • hashset
    的大小是一个
    int
    ,用于比较,而不是
    整数
  • 如果返回值,则无需添加
    if-else if-else
    。此外,您可以只返回减法后的值:
    returno2vals-o1Vals
  • 您在某些点和地图中使用了
    Entry
    。Entry
    ,您确定导入正确吗?在任何情况下,我建议您始终使用其中一种,以确保类型相同
也就是说,解决方案应该如下所示:

public List<Entry<String, HashSet<String>>> orderByDescStringSetSize2(HashMap<String, HashSet<String>> map) {
    Set<Entry<String, HashSet<String>>> set = map.entrySet();
    List<Entry<String, HashSet<String>>> list = new ArrayList<>(set);

    Collections.sort(list, new Comparator<Entry<String, HashSet<String>>>() {

    @Override
    public int compare(Entry<String, HashSet<String>> o1, Entry<String, HashSet<String>> o2) {
        int o1Vals = o1.getValue().size();
        int o2Vals = o2.getValue().size();

        // Descending
        return o2Vals - o1Vals;
    }
    });
    return list;
}

可能重复的添加导致引发异常的映射示例。重复上为“是”。我建议使用
返回o2Vals-o1Vals你应该很好。非常感谢你们所有人!很抱歉,我进行了复制。可能的复制添加导致引发异常的映射示例。复制上的是。我建议使用
返回o2Vals-o1Vals你应该很好。非常感谢你们所有人!很抱歉我复制了。非常感谢!!我没有想到这一点,或者更好,在这里使用
int
,因为当
size()
返回
int
时,没有理由使用
Integer
。或者将整个方法简化为
返回整数.compare(o1.getValue().size(),o2.getValue().size())非常感谢!!我没有想到这一点,或者更好,在这里使用
int
,因为当
size()
返回
int
时,没有理由使用
Integer
。或者将整个方法简化为
返回整数.compare(o1.getValue().size(),o2.getValue().size())