2012-07-23 44 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