[英]Elegant way to loop through a list of strings, split each string and output except N first elements
[英]Get first n elements from sortedmap
我嘗試將字符串的頻率存儲在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進行迭代,但是沒有一種方法可以保留其原始順序,最終導致結果未排序。 幫助和提示表示贊賞!
您可以從排序后的映射中獲取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()
我不了解Groovy,所以我只能評論Java。
TreeMap
使條目按鍵而不是值排序。 在您的情況下,它使用String
的自然順序。
如果要讓Map
保持插入順序,請使用LinkedHashMap
。 如果這樣做,則需要將返回類型更改為Map<String, Integer>
。
我不清楚您的某些變量的類型,因此無法編寫詳細的代碼,但是基本步驟如下:
value
字段對List
keywords
排序。 Map<String, Integer> map = new LinkedHashMap<String, Integer>();
keywords
的前n
項目並填充map
。 因為您使用的是LinkedHashMap
所以條目將保持正確的順序。 return map;
從您的代碼看來,您似乎正在使用groovy,這是您可以使用for loop
在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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.