按多个字段对一组字符串、整数进行排序

Sort Entry Set of String, Integer by more than one field

有一个 Map 并尝试对 String 的值和长度进行排序。我试图比较语句中的两个不同的东西,所以不知道我是否需要两个不同的语句。这用于比较数字根,因此字符串长度和数字根是值和值。

例如:

("103",4); (1+0+3 == 4)
("4",4); (4 ==4)
("11101",4); (1+1+1+0+1 == 4)
("5",5); (5 == 5 )
("1003",4); (1+0+0+3 == 4)

但是("103",4) > ("4",4)因为"103">"4"的长度,而且("11101",4) > ("103",4);,长度"11101" > "103"

Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { int length = o1.getKey().length().compareTo(o2.getKey().length());
if(length != 0) {
 return length;
}
return (o1.getValue()).compareTo(o2.getValue());
}
});

编辑对上述问题的回答(同时给出了回复)

 Map<String,Integer> unsortMap = new.
                        TreeMap<String,Integer>();

unsortMap.put("103",4);
unsortMap.put("4",4);
unsortMap.put("11101",4);   
unsortMap.put("5",5);
unsortMap.put("1003",4); Map<String,

 Integer> result =unsortMap.entrySet().stream() .sorted(Map.Entry.comparingByKey(Comparator.comparingInt(String::length)) )
   .sorted(Map.Entry.comparingByValue()) .collect(Collectors.toMap
     (Map.Entry::getKey, Map.Entry::getValue, (oldValue, newValue) -> oldValue, LinkedHashMap::new)); 

 System.println(result);

If you already have a map, and you want to order it, by lenght key, and by value then:

Map<String,Integer> unsortMap = new TreeMap<String,Integer>();

unsortMap.put("103",4);
unsortMap.put("4",4);
unsortMap.put("11101",4);
unsortMap.put("5",5);
unsortMap.put("1003",4);

Map<String, Integer> result = unsortMap.entrySet().stream()
        .sorted(Map.Entry.comparingByKey(Comparator.comparingInt(String::length))

        ).sorted(Map.Entry.comparingByValue())
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
                (oldValue, newValue) -> oldValue, LinkedHashMap::new));


System.out.println(result);

out => {4=4, 103=4, 1003=4, 11101=4, 5=5}

如果是按长度排序,可以这样比较。

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

    @Override
    public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
        // TODO Auto-generated method stub

        if (o1.getKey().length() == o2.getKey().length()) {
            return 0;
        }

        if (o1.getKey().length() > o2.getKey().length()) {
            return 1;
        } else {
            return -1;
        }

    }

});

你还没说为什么它不起作用。当你尝试时会发生什么?

在Java中,一个Map不是用来排序的,是用来快速访问的。 但是,像 TreeMap 这样的实现保持确定性排序,并且可以排序。您的代码表明您正在尝试对地图的 EntrySet 进行排序。 AJavaSet也没有顺序,无法排序

我建议您要么像 TreeMap 一样使用 NavigableMap,要么使用 List 而不是 Set。 A Java List 有一个顺序,可以使用 Collections.sort(...).

排序

您的现有代码无法正常工作的原因有很多。一方面,您正试图在 int(在 o1.getKey().length().compareTo(...))上调用 compareTo。这不可能。您可以改为使用:

Ints.compare(o1.getKey().length(), o2.getKey().length());