Sort Entry Set of String,Integer by more one field

时间:2017-11-13 18:50:24

标签: java sorting collections comparator compareto

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

例如:

void myfunc(int *a, int *b) {
    *a = *b + 3;
    *b = *a;
}

int main() {
    int a = 10;
    int b =  5;
    myfunc(&a, &b);

    return 0;
}

但是("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"和("103",4) > ("4",4)("11101",4) > ("103",4);

"11101" > "103"

为什么这不起作用?

3 个答案:

答案 0 :(得分:2)

  

如果您已经有地图,并且想要按长度键和按值排序,那么:

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}

答案 1 :(得分:1)

如果您打算按长度排序,可以这样比较。

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

    }

});

答案 2 :(得分:0)

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

在Java中,Map不是要排序的,而是用于快速访问。 但是,像TreeMap这样的实现保持了确定性排序,并且可以进行排序。您的代码建议您尝试对地图EntrySet进行排序。 Java Set也没有订单,也无法排序。

我建议您使用NavigableMap,例如TreeMap,或使用List而不是Set。 Java List有一个订单,可以使用Collections.sort(...)进行排序。

您的现有代码可能无法正常工作的原因有很多。首先,您尝试在compareToint)上致电o1.getKey().length().compareTo(...)。这是不可能的。你可以改用:

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