ArrayList没有重复

时间:2010-05-04 16:35:21

标签: java collections arraylist

我在java中使用了arraylist,我需要在10次迭代中添加整数(整数是从名为arrint的整数数组中随机获得的),没有任何重复:

for (int i =0; i<10; ++i)
    array.add(integer);

然后在20次迭代期间为相同的整数数组(arrint)添加相同的数组20个其他整数而不重复

for (int i =0; i<10; ++i)
    array.add(integer);

但允许在10个第一个整数和20个整数之间重复。

谢谢

5 个答案:

答案 0 :(得分:10)

Set,而不是List,可以防止重复。因此,您可以建立Set<Integer>并在填充之后,将其所有元素添加到列表中(使用list.addAll(set))。然后清除Set并重复下一个20。

从您的描述中不清楚如果遇到重复,您希望发生什么。是否要将项目添加到Set中,直到它包含10,只是丢弃重复项?或者如果遇到重复,你想抛出异常吗?

答案 1 :(得分:6)

public class Foo {
  private final Random random = new Random();

  public List<Integer> createList() {
    // Create empty list to store results.
    List<Integer> ret = new ArrayList<Integer>(30);

    // Add 10 randomly generated integers.
    ret.addAll(createRandomIntegers(10));

    // Add another 20 randomly generated integers which could potentially
    // contain integers already added previously (the OP states that this is ok).
    ret.addAll(createRandomIntegers(20));

    return ret;
  }

  /**
   * Utility function that creates a set of randomly generated
   * integers of specified size.  We use a Set to avoid duplicates.
   */
  protected Set<Integer> createRandomIntegers(int sz) {
    Set<Integer> ret = new HashSet<Integer>();

    while (ret.size() < sz) {
      ret.add(random.nextInt());
    }

    return ret;
  }
}

答案 2 :(得分:1)

我个人会使用一个集合作为每个集合的中间体,不允许重复,然后将其全部添加到列表中。它远不是最“OMG OPTIMIZED”解决方案,但它对未来的读者来说非常清楚它的作用。

    List<Integer> list = new ArrayList<Integer>();

    Set<Integer> subSet = new HashSet<Integer>();

    for (int i =0; i<10; ++i) {
         subSet.add(integers10[i]);
    }
    list.addAll(subSet);
    subSet.clear();

    for (int i =0; i<20; ++i) {
         subSet.add(integers20[i]);
    }
    list.addAll(subSet);
    subSet.clear();

答案 3 :(得分:1)

我理解你需要一个List(因为你需要按顺序保存元素)并且还想要一个set的功能 - 防止重复。

因此,您可以编写自己的类(比如SetList<E>),它将继承ArrayList<E>并实现Set<E>接口。为此,您可以将HashSet<E>作为班级SetList<E>的属性。像这样:private Set<E> set = new HashSet<E>();然后只需将插入和删除与属性中的集同步,如果集已经包含插入的元素,则不要插入它。最重要的方法add(E element)就像:

public void add(E element){
    if(set.contains(element)){
        return;
    }
    set.add(element);
    super.add(element);
}

对于其他方法,它将是类似的。

我前段时间做过这个,但后来我找到了更好的解决方案:GlazedLists。 免费图书馆可以完成所有这些工作。我建议你使用UniqueList

答案 4 :(得分:0)

Apache的Java Collections项目通常有代码来执行Java语言忘记的大多数常见任务。这是其中之一:

org.apache.commons.collections.list.SetUniqueList中的

Commons-Collections