从sortedmap获取前n个元素

时间:2015-09-11 17:15:48

标签: groovy treemap

我试图在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;提示赞赏!!

3 个答案:

答案 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>

由于我不清楚某些变量的类型,我无法编写详细的代码,但基本步骤是:

  1. 根据List字段对keywords value进行排序。
  2. Map<String, Integer> map = new LinkedHashMap<String, Integer>();
  3. n中的第一个keywords项进行迭代,并填充map。由于您使用的是LinkedHashMap,因此条目将保持正确的顺序。
  4. return map;

答案 2 :(得分:1)

从您的代码开始,您似乎正在使用groovy,以下是如何使用for loop

在groovy中执行此操作
    TreeMap<String,Integer> result = new TreeMap<>()
    for(def entry : keywords) {
        result[entry.key] = entry.value

        n--
        if(n == 0)
            break
    }

    return result