Groovy 从sortedmap获取前n个元素
我尝试将字符串的频率存储在树形图中,这样我就可以得到最常用的字符串,比如说,特定用户的字符串。 现在我要做的是编写一个方法,从排序后的映射中返回前n个项(最常用项)Groovy 从sortedmap获取前n个元素,groovy,treemap,Groovy,Treemap,我尝试将字符串的频率存储在树形图中,这样我就可以得到最常用的字符串,比如说,特定用户的字符串。 现在我要做的是编写一个方法,从排序后的映射中返回前n个项(最常用项) public TreeMap<String,Integer> getKeywords(int n){ //Can check if sorted for efficiency! println keywords.size(); keywords=keywords.sort{a,b->
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;
}
公共树映射getKeywords(int n){
//可以检查是否为效率排序!
println关键字.size();
关键字=关键字。排序{a,b->
//按值对映射描述进行排序
b、 价值a.价值;
}
TreeMap结果=新的TreeMap();
//需要用关键字中的前n个元素填充结果
返回结果;
}
我尝试过几种方法,比如在关键字上使用.each()
,或者迭代其键集,但没有一种方法保留其原始顺序,结果是未排序。
感谢您的帮助和提示 我不懂Groovy,所以只能对Java进行评论
TreeMap
按键而不是值对条目进行排序。在您的例子中,它使用的是String
s的自然顺序
如果希望使用Map
来保持插入顺序,请使用LinkedHashMap
。如果执行此操作,则需要将返回类型更改为Map
我无法编写详细的代码,因为我不清楚某些变量的类型,但基本步骤如下:
值
字段对列表
关键字进行排序Map Map=newlinkedhashmap()代码>
keywords
中的第一个n
项,并填充map
。由于您使用的是LinkedHashMap
,因此条目将保持正确的顺序返回图代码>
我不懂Groovy,所以只能对Java进行评论
TreeMap
按键而不是值对条目进行排序。在您的例子中,它使用的是String
s的自然顺序
如果希望使用Map
来保持插入顺序,请使用LinkedHashMap
。如果执行此操作,则需要将返回类型更改为Map
我无法编写详细的代码,因为我不清楚某些变量的类型,但基本步骤如下:
值
字段对列表
关键字进行排序Map Map=newlinkedhashmap()代码>
keywords
中的第一个n
项,并填充map
。由于您使用的是LinkedHashMap
,因此条目将保持正确的顺序返回图代码>
从您的代码来看,您似乎正在使用groovy,下面是如何在groovy中使用
for循环来实现这一点
TreeMap<String,Integer> result = new TreeMap<>()
for(def entry : keywords) {
result[entry.key] = entry.value
n--
if(n == 0)
break
}
return result
TreeMap结果=新的TreeMap()
用于(def条目:关键字){
结果[entry.key]=entry.value
n--
如果(n==0)
打破
}
返回结果
从您的代码来看,您似乎在使用groovy,下面是如何在groovy中使用for循环来实现这一点
TreeMap<String,Integer> result = new TreeMap<>()
for(def entry : keywords) {
result[entry.key] = entry.value
n--
if(n == 0)
break
}
return result
TreeMap结果=新的TreeMap()
用于(def条目:关键字){
结果[entry.key]=entry.value
n--
如果(n==0)
打破
}
返回结果
您可以从排序后的映射中获取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()
def getKeywords(映射关键字,int itensQty){
def sorted=关键字。排序{a,b->
b、 价值a.价值;
}
sorted.entrySet().toList()[0..您可以从排序映射中获取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()
def getKeywords(映射关键字,int itensQty){
def sorted=关键字。排序{a,b->
b、 价值a.价值;
}
sorted.entrySet().toList()[0..该死,你比我快-稍微简单一点:keywords.entrySet().sort{-it.value}[0..这是一个简洁的解决方案。真遗憾,我不能为同一个线程同时接受两个答案!该死,你比我快-稍微简单一点:keywords.entrySet().sort{-it.value}[0..这是一个简洁的解决方案。很遗憾,对于同一个线程,我不能同时接受两个答案!精辟。问题是当我指定关键字=关键字。排序{…},由于树状图的性质,关键字再次按键排序!在我将其更改为LinkedHashMap后,事情按计划进行了!精辟。问题是当我指定关键字=关键字时。排序{…},由于树状图的性质,关键字再次按键排序!在我将其更改为LinkedHashMap后,事情按计划进行了!