2013-09-25 74 views
8

插入重复我是新手,去渣。我有一个ArrayList,我想避免重复插入。我ArrayList的Java:避免在ArrayList中

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

和我要检查该字段为:

kar.getinsertkar(). 

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

+3

“但我不知道”你是什么意思?使用'HashSet',就像你读过的一样。 –

+0

[线索](http://docs.oracle.com/javase/tutorial/collections/interfaces/set.html) – ajb

+0

注意,没有规定说你不能有* *两者的'ArrayList'和' HashSet'与相同的元素。你可以使用一个'ArrayList'来保存你想要的顺序的元素,'HashSet'来检查一个元素是否已经存在。 (这个检查比搜索'ArrayList'快,但是维护两个集合会减慢速度。)有时候这是正确的做事方式。 – ajb

回答

4

使用HashSet而不是ArrayList。但是,要真正使HashSet确实工作得很好,你必须重写插入HashSet类/对象的equals()hashCode()方法。

敌人例如:

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() 
} 

请参看下面的documentation用于覆盖hashCode()equals()

+0

我使用的ArrayList遍布在我班上的其他方法,我能怎样改变? – user2766131

+0

+1很好的建议,我们可以指出的是,进入了集中的对象应该有一个适当的equals()和hashCode()方法来实现。 – vikingsteve

+0

在一个HashSet使用的方法应该是同一个ArrayList,因为它们都实现了相同的接口。 – blackpanther

20

每当你想避免重复,要使用一个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... 

这会给你一些类型的安全以及获取项目进出你的设置。

+4

并请使用参数化类型... – vikingsteve

+4

也通常我们使用瓦尔接口类型:'设置 stringSet =新的HashSet ();'不执行 – 2013-09-25 19:50:50

4

一套很简单,可以不包含重复的,因此听起来很适合你的集合。

这也是很容易实现。例如:

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对象,但他们可以很容易地被交换到任何其他对象类型。

0

您需要使用任何Set实施,e.g您可以使用HashSet。 如果您想将add自定义对象kar纳入您的HashSet,您需要overrideequalshashcode方法。 你可以阅读更多关于equalshashcodesee