Java:避免在arraylist中插入副本

时间:2013-09-25 19:44:04

标签: java data-structures

我是java的新手。我有一个ArrayList,我希望避免重复插入。我的ArrayList

ArrayList<kar> karList = new ArrayList<kar>();

我要检查的字段是:

 kar.getinsertkar().

我读过我可以使用HashSetHashMap,但我不知道。

6 个答案:

答案 0 :(得分:23)

每当您想要防止重复时,您都希望使用Set

在这种情况下,HashSet对你来说很合适。

HashSet karSet = new HashSet();
karSet.add(foo);
karSet.add(bar);
karSet.add(foo);
System.out.println(karSet.size());
//Output is 2

为了完整起见,我还建议您使用该类的通用(参数化)版本,假设Java 5或更高版本。

HashSet<String> stringSet = new HashSet<String>();
HashSet<Integer> intSet = new HashSet<Integer>();
...etc...

这样可以为您提供一些类型的安全性,以便将物品放入和取出物品。

答案 1 :(得分:7)

使用HashSet代替ArrayList。但是,要真正使HashSet真正有效,您必须覆盖插入equals()的类/对象的hashCode()HashSet方法。

敌人的例子:

 Set<MyObject> set = new HashSet<MyObject>();
 set.add(foo);
 set.add(bar);

 public class MyObject {
     @Override
     public boolean equals(Object obj) {
         if (obj instanceof MyObject)
             return (this.id = obj.id) 
         else
             return false;
     }
     // now override hashCode()
}

有关覆盖hashCode()equals()的信息,请参阅以下documentation

答案 2 :(得分:6)

您可以使用LinkedHashSet,以避免重复的元素并保持插入顺序。

http://docs.oracle.com/javase/7/docs/api/java/util/LinkedHashSet.html

答案 3 :(得分:5)

一个集合只是一个不能包含重复项的集合,因此听起来很完美。

实施起来也很简单。例如:

Set<String> mySet = new HashSet<String>();

这将为您提供一个可以容纳String类型的对象的集合。

添加到集合就是这么简单:

mySet.add("My first entry!");

根据集合的定义,您可以添加任何您想要的内容,而不会遇到重复内容。

玩得开心!

编辑:如果您决定使用ArrayList,那么在添加对象之前很容易看到对象是否已经在列表中。例如:

public void addToList(String newEntry){
    if(!myList.contains(newEntry))
        myList.add(newEntry);
}

注意:我的所有示例都假设您正在使用String对象,但可以轻松地将它们交换到任何其他Object类型。

答案 4 :(得分:0)

您需要使用任何Set实施,例如,您可以使用HashSet。 如果您希望将add自定义对象kar添加到HashSet,则需要override equalshashcode方法。 您可以详细了解equalshashcodesee

答案 5 :(得分:0)

您可以实现自己的List,它扩展LinkedList并覆盖其添加方法:

  1. public boolean add(E e)
  2. public void add(int index,E element)
  3. public boolean addAll(Collection collection)
  4. public boolean addAll(int index,Collection collection)