gpt4 book ai didi

java - 以正确的顺序迭代 ConcurrentHashMap

转载 作者:行者123 更新时间:2023-11-30 06:04:58 27 4
gpt4 key购买 nike

我使用 ConcurrentHashMap 来存储英语单词及其在文本中的出现情况。

private Map<String, Integer> _vocab = new ConcurrentHashMap<String,Integer>();

我需要按值降序对 map 进行排序,所以我这样做了:

   public void sort(){
this._vocab = this._vocab.entrySet()
.stream()
.sorted(Collections.reverseOrder(Map.Entry.comparingByValue()))
.collect(
toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2,
LinkedHashMap::new));
}

这似乎有效。但是,现在我想将 HashMap 限制为 1000 个元素,因为我只对前 1000 个条目感兴趣:

public void limitToNElements(int n){
ConcurrentHashMap<String, Integer> res = new ConcurrentHashMap<String, Integer>();

Iterator it = this._vocab.entrySet().iterator();
int i = 0;
while (it.hasNext() && i < n) {
Map.Entry pair = (Map.Entry)it.next();
String word = (String)pair.getKey();
res.put((String)pair.getKey(), (Integer)pair.getValue());

i += 1;
}

this._vocab = res;
}

问题是,迭代器没有按正确的顺序迭代,而是随机迭代。

所以我读到只有 LinkedHashMaps 可以这样工作,但由于没有并发版本,而且我害怕自己进行同步,我想知道是否有任何解决方法可以实现什么我想要吗?

编辑:我使用 HashMap 因为插入/出现计数非常简单:

for(String word: input){
this._vocab.put(word, this._vocab.getOrDefault(word, 0)+1);
}

最佳答案

您可以只在流上应用限制:

public void sort() {
this._vocab = this._vocab.entrySet()
.stream()
.sorted(Collections.reverseOrder(Map.Entry.comparingByValue()))
.limit(1000) // Here
.collect(
toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e2,
LinkedHashMap::new));
}

关于java - 以正确的顺序迭代 ConcurrentHashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47944811/

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