我试图在TreeMap中存储字符串的频率,以便我可以获得最常用的字符串,比如说特定用户。 现在我要做的是编写一个方法,从排序后的地图中返回前n个项目(最常用)。
public TreeMap<String,Integer> getKeywords(int n){
//Can check if sorted for efficiency!
println keywords.size();
keywords=keywords.sort{a,b->
//sort the map desc by value
b.value <=> a.value;
}
TreeMap<String,Integer> result=new TreeMap<>();
//need to fill result with first n elements from keywords
return result;
}
我尝试了几种方法,例如在关键字上使用.each()
或迭代其keySet,但没有保留其原始顺序,我最终得到的结果未排序。
帮助&amp;提示赞赏!!
答案 0 :(得分:5)
您可以从排序地图中获取entrySet()
,其行为或多或少类似于列表,并从中获取范围:
def getKeywords(Map keywords, int itensQty){
def sorted=keywords.sort{ a, b ->
b.value <=> a.value;
}
sorted.entrySet().toList()[0..<itensQty]
}
keywords = ["a": 90, "b": 110, "c": 70, "d": 130]
assert getKeywords(keywords, 2) == ["d": 130, "b": 110].entrySet().toList()
答案 1 :(得分:2)
我不了解Groovy,所以我只能评论Java。
TreeMap
保持条目按键排序,而不是值。在您的情况下,它使用String
s的自然顺序。
如果您希望Map
维持插入顺序,请使用LinkedHashMap
。如果您这样做,则需要将返回类型更改为Map<String, Integer>
。
由于我不清楚某些变量的类型,我无法编写详细的代码,但基本步骤是:
List
字段对keywords
value
进行排序。Map<String, Integer> map = new LinkedHashMap<String, Integer>();
n
中的第一个keywords
项进行迭代,并填充map
。由于您使用的是LinkedHashMap
,因此条目将保持正确的顺序。return map;
答案 2 :(得分:1)
从您的代码开始,您似乎正在使用groovy,以下是如何使用for loop
TreeMap<String,Integer> result = new TreeMap<>()
for(def entry : keywords) {
result[entry.key] = entry.value
n--
if(n == 0)
break
}
return result