我有一个我要添加的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);
}
但必须有一种更简单的方法。 有没有人知道更简洁的方法呢?
答案 0 :(得分:9)
我会考虑使用Set
而不是ArrayList。集合由它们的要求定义,即所有对象都是唯一的。 HashSet
是一个很好的默认选择,可能是您在这种情况下使用的更正确的数据结构,但这最终是您的呼叫。
当您添加到集合时,如果对象已包含在集合中,则add
方法将返回false
,并且不会添加副本。
如果需要可预测的迭代顺序,可以使用LinkedHashSet。
此实现与HashSet的不同之处在于它维护了一个贯穿其所有条目的双向链表。此链接列表定义迭代排序,即元素插入集合的顺序(插入顺序)
最后,您可以考虑在TreeSet中使用可导航的集合。根据上面的信息,它看起来并不重要,所以它可能不是你的正确选择,但是你的后袋里有很好的信息。
确保如果要将自己的类的对象添加到Set中,您可以覆盖并正确覆盖equals()方法。不这样做只会导致引用被比较,并将导致意外的行为,并引起明显的头痛。使用@Override注释来确保你正确地覆盖,但我离题了。
答案 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)
您可能有错误的数据结构。在这种情况下,设置会更好。