簡體   English   中英

從sortedmap獲取前n個元素

[英]Get first n elements from sortedmap

我嘗試將字符串的頻率存儲在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進行迭代,但是沒有一種方法可以保留其原始順序,最終導致結果未排序。 幫助和提示表示贊賞!

您可以從排序后的映射中獲取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()

我不了解Groovy,所以我只能評論Java。

TreeMap使條目按鍵而不是值排序。 在您的情況下,它使用String的自然順序。

如果要讓Map保持插入順序,請使用LinkedHashMap 如果這樣做,則需要將返回類型更改為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,這是您可以使用for loop在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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM