gpt4 book ai didi

java - putAll() 之后 TreeMap 中缺少值

转载 作者:行者123 更新时间:2023-12-02 02:34:52 25 4
gpt4 key购买 nike

我有一个将字符映射到整数的 HashMap。为了按值对其进行排序,我编写了比较器并使用 TreeMap。但我缺少值(value)。我检查了字符串“tree”。每个循环之后的 map “字符”看起来像 {r=1, t=1, e=2} , putAll 之后的树(两行之后)是 {e=2, r=1}。 char 't' 发生了什么?为什么会错过呢?我该如何更改它?

class ValueComparator implements Comparator<Character> {

private Map<Character, Integer> map;

public ValueComparator(Map<Character, Integer> map) {
this.map = map;
}

public int compare(Character a, Character b) {
return map.get(b).compareTo(map.get(a));
}
}

public String frequencySort(String s) {
if (s.length() <= 1) return s;

HashMap<Character,Integer> chars = new HashMap<Character,Integer>();
for(Character c : s.toCharArray()){
if (chars.containsKey(c)){
chars.put(c,chars.get(c)+1);

}
else {
chars.put(c,1);
}
}

TreeMap<Character,Integer> tree = new TreeMap<Character,Integer>(new ValueComparator(chars));
tree.putAll(chars);

/**
* rest of the code
**/

}

最佳答案

您的ValueComparator将具有相同计数的条目视为重复条目。一个简单的解决方法是使用 key 作为决胜局:

public int compare(Character a, Character b) {
int result = map.get(b).compareTo(map.get(a));
return result != 0 ? result : a.compareTo(b);
}

或者,您可以使用流来构建频率图,对其进行排序并将其存储为有序的LinkedHashMap:

Map<Character, Integer> counts = s.chars()
.mapToObj(i -> (char)i)
.collect(Collectors.groupingBy(Function.identity(), Collectors.summingInt(c -> 1)))
.entrySet()
.stream()
.sorted(Collections.reverseOrder(Entry.comparingByValue()))
.collect(Collectors.toMap(Entry::getKey, Entry::getValue, (a, b) -> b, LinkedHashMap::new));

关于java - putAll() 之后 TreeMap 中缺少值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46532939/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com