簡體   English   中英

在TreeMap中使用某些東西的類方法

[英]Using the class methods of something in a TreeMap

我知道已經有關於這個確切問題的主題,但是沒有一個主題能真正回答我的問題。 有沒有辦法做到這一點? 如果我有一個使用字符串作為鍵的TreeMap和使用TreeSet類的對象作為值的TreeMap,是否可以將一些int添加到與特定鍵關聯的集合中?

好吧,我應該做的是使用TreeMap和TreeSet類從文本文件中取得一致性。 我的計划是使用TreeMap鍵作為文本文件中的單詞,其值將是出現單詞的行號集。 因此,您遍歷文本文件,每次聽到一個單詞時,都要檢查TreeMap以查看是否已具有該鍵,如果不存在,則將其添加並創建一個新的以行號開頭的TreeSet行號上。 如果已經有了,則只需將行號添加到集合中。 所以您看到我需要做的是訪問集合的.add()函數

就像是

map.get(identifier).add(lineNumber);

我知道那行不通,但是我該怎么辦呢? 我的意思是,如果有一種更簡單的方法來做我想做的事情,我會很樂意這樣做,但是我仍然想知道如何以這種方式做這件事,只是因為您知道學習和經驗以及所有這些。

考慮以下邏輯(我假設輸入單詞在一個數組中):

TreeMap<String, TreeSet<Integer>> index = new TreeMap<String, TreeSet<Integer>>();
for (int pos = 0; pos < input.length; pos++) {
    String word = input[pos];
    TreeSet<Integer> wordPositions = index.get(word);
    if (wordPositions == null) {
        wordPositions = new TreeSet<Integer>();
        index.put(word, wordPositions);
    }
    wordPositions.add(pos);
} 

這將產生您需要的索引,該索引從字符串映射到該字符串出現的一組位置。 根據您的特定需求,外部/內部數據結構可以分別更改為HashMap / HashSet。

為什么不使用StringArrayList<int>Map ,例如:

Map<String, List<Integer>> map = new HashMap<String, List<Integer>>();

然后,總會在您收到單詞時檢查Map是否已存在該單詞,如果確實存在,則將行號添加到List ,如果沒有,則在Map為給定單詞和給定行號創建一個新條目。

if (map.get(word ) != null) {
    map.get(word).add(line);
}
else{
    final List<Integer> list = new ArrayList<Integer>();
    list.add(line);
    map.put(word, list);
}

如果我理解正確,則希望有一個樹形圖,其中每個鍵都引用一個樹集,用於存儲出現鍵的行號。 這絕對是可行的,並且實現起來非常簡單。 我不確定為什么你的map.get(identifier).add(lineNumber); 不管用。 這就是我要做的:

TreeMap<String, TreeSet<Integer>>  map = new TreeMap<String, TreeSet<Integer>>();
        TreeSet<Integer> set = new TreeSet<Integer>();
        set.add(1234);
        map.put("hello", set);
        map.get("hello").add(123);

一切正常。

您的構造無法正常工作的唯一原因是map.get(identifier)的結果可以為null。 就個人而言,我喜歡@EyalSchneider回答的惰性初始化解決方案。 但是,如果您提前知道所有標識符,則有另一種選擇:例如,如果您在Map預加載了所有已知的英語單詞。 然后,您可以執行以下操作:

for (String word : allEnglishWords) {
    map.put(word, new LinkedList<Integer>);
}

for (int pos = 0; pos < input.length; pos++) {
    String word = input[pos];
    map.get(word).add(pos);
}

暫無
暫無

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

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