繁体   English   中英

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

[英]Add an object to a java structure only if it isn't already there

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

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

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

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

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

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

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

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

HashSet Javadocs

TreeSet Javadocs

LinkedHashSet Javadocs

使用ArrayList#contains代替:

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

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

一种干净的方法,如果你不介意因复制和订购而造成的性能损失并不重要:

使用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]

如果您需要List语义(即元素是有序的),那么您可以UniqueArrayList 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 根据定义和实现,集合仅包含唯一元素。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM