仅当对象尚未存在时才将对象添加到java结构中

时间:2013-09-10 19:52:42

标签: java arraylist

我有一个我要添加的arrayList,只要该值尚未存储在其中。例如,如果我的数组是这样的:

H
LK
KL
LS

我有值LS,它不会被添加。但如果价值是A,那就是。我不关心订单或排序。只是信息是否在那里。

我在想代码应该是这样的:

value = A;
no = 0; 
for (int o; arraylist.length; o++)
   if (arraylist.get(o).equals(value)){
     continue;
   }else{ 
      no++;
   }
}
if (arraylist.length = no){
    arraylist.add(value);
}

但必须有一种更简单的方法。 有没有人知道更简洁的方法呢?

5 个答案:

答案 0 :(得分:9)

我会考虑使用Set而不是ArrayList。集合由它们的要求定义,即所有对象都是唯一的。 HashSet是一个很好的默认选择,可能是您在这种情况下使用的更正确的数据结构,但这最终是您的呼叫。

当您添加到集合时,如果对象已包含在集合中,则add方法将返回false,并且不会添加副本。

如果需要可预测的迭代顺序,可以使用LinkedHashSet。

  

此实现与HashSet的不同之处在于它维护了一个贯穿其所有条目的双向链表。此链接列表定义迭代排序,即元素插入集合的顺序(插入顺序)

最后,您可以考虑在TreeSet中使用可导航的集合。根据上面的信息,它看起来并不重要,所以它可能不是你的正确选择,但是你的后袋里有很好的信息。

确保如果要将自己的类的对象添加到Set中,您可以覆盖并正确覆盖equals()方法。不这样做只会导致引用被比较,并将导致意外的行为,并引起明显的头痛。使用@Override注释来确保你正确地覆盖,但我离题了。

HashSet Javadocs

TreeSet Javadocs

LinkedHashSet Javadocs

答案 1 :(得分:3)

改为使用ArrayList#contains

if (!arraylist.contains(value)){
     arraylist.add(value);
}

请注意contains取决于具有equals()方法的对象。也就是说,列表包含null,value为空,或value.equals(o)为列表元素的o

答案 2 :(得分:3)

如果您不介意因复制和订购而导致性能下降并不重要,那么可以采取一种简洁的方法:

使用HashSet,在其中插入所有内容并将其内容复制到List。例如:

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

set.add("H");
set.add("LK");
set.add("KL");
set.add("LS");
set.add("LS");
set.add("A");

List<String> list = new ArrayList<String>();
list.addAll(set);

System.out.println(list);

输出:

[A, KL, LK, LS, H]

答案 3 :(得分:1)

如果你需要List语义(即元素是有序的),那么你可以继承ArrayList(你称之为UniqueArrayList或其他东西)并覆盖它的add调用contains并仅在元素不存在时添加元素的方法。

public class UniqueArrayList<E> extends ArrayList<E> {

    @Override
    public boolean add(E e) {
        if (!contains(e)) {
            return super.add(e);
        } else {
            return false;
        }
    }

    // TODO: override addAll etc.
}

与在任何地方进行if(!list.contains(...检查(或甚至循环)相比,这将是面向对象最多的方式。

它还允许您保留List个对象的现有功能,例如,如果需要,可以通过get按索引访问元素。

如果订单的概念不重要,您可以使用Set。根据定义和实现,集合仅包含唯一元素。

答案 4 :(得分:0)

您可能有错误的数据结构。在这种情况下,设置会更好。