从 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 使条目按键而不是值排序。在您的情况下,它使用 Strings 的自然顺序。

如果要Map保持插入顺序,请使用LinkedHashMap。如果这样做,您需要将 return 类型更改为 Map<String, Integer>.

我写不出详细的代码,因为我不清楚你的一些变量的类型,但基本步骤是:

  1. 根据 value 字段对 List keywords 进行排序。
  2. Map<String, Integer> map = new LinkedHashMap<String, Integer>();
  3. 迭代 keywords 中的前 n 项并填充 map。因为您使用的是 LinkedHashMap,条目将保持正确的顺序。
  4. 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()