1

我有一个包含大约 20,000,000 个条目的列表。大约 5,000,000 个条目是唯一的。我需要遍历我的列表,识别唯一条目,并为每个条目分配一个 0 到 5,000,000 之间的整数。

目前,我按顺序将每个条目添加到 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() 时,有没有办法获取位置?

4

2 回答 2

2

我会简单地使用一个计数器和HashMap<Keyword, Integer>. 对于列表中的每个关键字,从地图中获取其位置。如果得到 null,则将关键字放入映射中,并将当前计数器值作为值,并递增计数器。

于 2012-07-23T21:06:10.883 回答
1

我会这样做:

  1. 通过填充 a 来计算对象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.
于 2012-07-23T21:07:40.407 回答