拥有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"
为什么这不起作用?
答案 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(...)
进行排序。
您的现有代码可能无法正常工作的原因有很多。首先,您尝试在compareTo
(int
)上致电o1.getKey().length().compareTo(...)
。这是不可能的。你可以改用:
Ints.compare(o1.getKey().length(), o2.getKey().length());