6

我有一个要添加到的 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);
}

但必须有一种更简单的方法来做到这一点。有谁知道更简洁的方法来做到这一点?

4

5 回答 5

11

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

添加到集合时,如果对象已包含在集合中,则该add方法将返回false,并且不会添加重复项。

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

此实现与 HashSet 的不同之处在于它维护一个双向链表,该列表贯穿其所有条目。这个链表定义了迭代顺序,也就是元素被插入到集合中的顺序(insertion-order)

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

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

哈希集 Javadocs

树集 Javadocs

LinkedHashSet Javadocs

于 2013-09-10T19:53:39.527 回答
3

改用ArrayList#contains

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

请注意,这contains取决于您的对象是否具有equals()方法。即,列表包含 null 并且value为 null,或者value.equals(o)对于某些o列表的元素。

于 2013-09-10T19:53:50.420 回答
3

如果您不介意由于复制和排序而造成的性能损失,那么一种干净的方法并不重要:

使用 a 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]
于 2013-09-10T19:58:58.770 回答
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对象的现有功能,例如通过索引访问元素 via get,以防这是必需的。

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

于 2013-09-10T19:55:58.770 回答
0

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

于 2013-09-10T20:01:35.143 回答