按多个字段对一组字符串、整数进行排序
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());
有一个 Map
例如:
("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());