2012-07-23 87 views
1

我有一個包含約20,000,000個條目的列表。大約5,000,000條目是獨特的。我需要迭代我的列表,識別唯一條目,併爲每個0到5,000,000之間的整數賦值。添加到TreeSet時的錄製位置

目前,我順序地將每個條目添加到TreeSet,然後使用.headSet()找出它的位置。我想這是不理想的。

while((nextline = wholefile.listIterator().next()) != null){ 

     //sorted, unique, addition 
     keywords.add(nextline); 

     //hmmm, get index of element in TreeSet? 
     k_j = keywords.headSet(nextline).size(); 

    } 

當我調用.add()時,有沒有辦法獲取位置?

+0

而不是列表,你爲什麼不使用一套? – 2012-07-23 21:05:25

+0

我簡化了一下。我實際上有一個名單,我只關心字符串的第一個條目的唯一性。其他條目不會是唯一的,但我仍然需要它們。 – dranxo 2012-07-23 21:07:38

回答

1

我會做如下:

  1. 通過填充一個Map<YourObject, Integer>計數的對象。
  2. 通過這個地圖,並分配序列號映射到值1

在代碼中的每個關鍵...

List<String> keywords = Arrays.asList("a", "b", "c", "a"); 

Map<String, Integer> counts = new HashMap<String, Integer>(); 
for (String str : keywords) { 
    if (!counts.containsKey(str)) 
     counts.put(str, 0); 

    counts.put(str, counts.get(str) + 1); 
} 

int seq = 0; 
for (String keyword : counts.keySet()) 
    if (counts.get(keyword) == 1)      // is unique? 
     System.out.println(keyword + " -> " + seq++); // assign id. 
+0

謝謝。有語法的確有幫助。 – dranxo 2012-07-23 21:23:09

2

我會簡單地使用一個計數器和HashMap<Keyword, Integer>。對於列表中的每個關鍵字,從地圖上獲取它的位置。如果您得到空值,則將當前計數器值作爲值的關鍵字放入映射中,然後遞增計數器。

+0

哦,對,地圖。我現在要試試這個。 – dranxo 2012-07-23 21:08:38