2012-07-01 51 views
6

我的问题是:什么是快速确定数字是否包含在Collection中以知道是否将其添加到集合并保持唯一性。如果我可以帮忙,我宁愿不重复列表。存储唯一整数的好方法

我有一个List<Integer>numberList。我希望它存储唯一的整数,并且不允许添加重复项。我愿做这样的事情:

private void add(int number) { 
    if (!numberList.contains(number)) { 
    numberList.add(number); 
    } 
} 

但显然这不会工作,因为numberList包含Integer对象的列表,无论数量的每一个都是唯一的对象。

谢谢!

+0

我认为'contains(...)'方法使用对象的equals(...)'方法来查看它是否被集合持有,所以上面的方法也应该防止重复。 –

+0

呵呵,也许别的东西是错误的,我的代码会产生意想不到的结果。谢谢你的提示! – kentcdodds

+1

如果你的代码和我的一样,那么总是有*别的错误!如果您需要寻找帮助,请回复更多信息! –

回答

12

一种是将整数存储在Set<Integer>中,例如。套件不允许重复。

编辑
此外,收藏的contains(...)方法使用对象的equals(...)方法,看它是否被收集或持有没有,所以你的上述方法将防止重复为好,如果你需要使用列表作为您的收藏。自己测试一下,你会发现它是如此。

例如:

List<Integer> numberList = new ArrayList<Integer>(); 
    int[] myInts = {1, 1, 2, 3, 3, 3, 3, 4}; 
    for (int i : myInts) { 
    if (!numberList.contains(i)) { 
     numberList.add(i); 
     } 
    } 

    System.out.println(numberList); 

将返回:[1, 2, 3, 4]

而且,与HashSets一个可能的问题是他们没有命令,因此,如果顺序很重要,你要看看使用其他种类的有序集合之一。

+0

出于好奇,你认为哪种实现会更快?在添加之前让'Set'处理重复项还是使用List中的'contains'会更快吗? – kentcdodds

+0

@kentcdodds:我相信哈希集会更快,因为哈希是一个非常快速的操作,但我不能100%的保证说,因为我从来没有研究算法的大O.但是,徘徊,其中一位计算机科学家将很快回答这个问题,毫无疑问。 –

+0

感谢您的提示! – kentcdodds

3

不是最简洁的形式是BitSet?它在存储方面效率很高,因为它会无限扩展。它也不会不必要地使用存储。

你在多线程环境中工作吗?如果有的话,还有其他的结构可能会更好/更有效率。

+0

你让我了!这是一个多线程环境,这就是我为什么这样做的原因。我想检查一个线程是否已经添加了该号码。 – kentcdodds

+0

在这种情况下,您几乎可以肯定地寻找'ConcurrentHashMap',可能包装在使用[newSetFromMap]派生的集合中(http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html #newSetFromMap%28java.util.Map%29),但如果你喜欢,你总是可以将'Boolean.TRUE'添加到'Map'。 – OldCurmudgeon

+1

BitSet对于小而密集的数字非常有效。但是'新的BitSet().add(Integer.MAXVALUE);'已经分配了268MB。所以应该小心使用它。 – Arne

相关问题