Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Groovy 从sortedmap获取前n个元素_Groovy_Treemap - Fatal编程技术网

Groovy 从sortedmap获取前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->

我尝试将字符串的频率存储在树形图中,这样我就可以得到最常用的字符串,比如说,特定用户的字符串。 现在我要做的是编写一个方法,从排序后的映射中返回前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;
}
公共树映射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后,事情按计划进行了!