从 sortedmap 中获取前 n 个元素
Get first n elements from sortedmap
我试图将字符串的频率存储在 TreeMap 中,以便我可以获得最常用的字符串,比如说,特定用户。
现在我想做的是写一个方法 return 我从排序映射中的前 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,但 none 保留了其原始顺序,我最终得到的结果是未排序的。
感谢帮助和提示!!
我不知道Groovy,所以我只能评论Java。
A TreeMap
使条目按键而不是值排序。在您的情况下,它使用 String
s 的自然顺序。
如果要Map
保持插入顺序,请使用LinkedHashMap
。如果这样做,您需要将 return 类型更改为 Map<String, Integer>
.
我写不出详细的代码,因为我不清楚你的一些变量的类型,但基本步骤是:
- 根据
value
字段对 List
keywords
进行排序。
Map<String, Integer> map = new LinkedHashMap<String, Integer>();
- 迭代
keywords
中的前 n
项并填充 map
。因为您使用的是 LinkedHashMap
,条目将保持正确的顺序。
return map;
从您的代码来看,您似乎正在使用 groovy,这是您在 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
您可以从已排序的映射中获取 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()
我试图将字符串的频率存储在 TreeMap 中,以便我可以获得最常用的字符串,比如说,特定用户。 现在我想做的是写一个方法 return 我从排序映射中的前 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,但 none 保留了其原始顺序,我最终得到的结果是未排序的。
感谢帮助和提示!!
我不知道Groovy,所以我只能评论Java。
A TreeMap
使条目按键而不是值排序。在您的情况下,它使用 String
s 的自然顺序。
如果要Map
保持插入顺序,请使用LinkedHashMap
。如果这样做,您需要将 return 类型更改为 Map<String, Integer>
.
我写不出详细的代码,因为我不清楚你的一些变量的类型,但基本步骤是:
- 根据
value
字段对List
keywords
进行排序。 Map<String, Integer> map = new LinkedHashMap<String, Integer>();
- 迭代
keywords
中的前n
项并填充map
。因为您使用的是LinkedHashMap
,条目将保持正确的顺序。 return map;
从您的代码来看,您似乎正在使用 groovy,这是您在 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
您可以从已排序的映射中获取 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()