【问题标题】:ArrayList without repetitionArrayList 不重复
【发布时间】:2010-05-04 16:35:21
【问题描述】:

我在 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 个整数之间允许重复。

谢谢你

【问题讨论】:

  • 如果你只是检查它是否已经存在,你可以使用 myArrayList.contains(int)。

标签: java collections arraylist


【解决方案1】:

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

如果遇到重复项,您的描述并不清楚您希望发生什么。是否要将项目添加到 Set 直到它包含 10 个,只是丢弃重复项?还是遇到重复时要抛出异常?

【讨论】:

  • +1,打败了我,而且答案比我写的要好。
  • 在下面回答了这个问题,但是 Apache Commons Collections 的代码似乎就是这样做的。
【解决方案2】:
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;
  }
}

【讨论】:

    【解决方案3】:

    我个人会使用一个集合作为每个不允许重复的集合的中间体,然后简单地将其全部添加到列表中。它远非最“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();
    

    【讨论】:

      【解决方案4】:

      我知道您需要有一个 List(因为您需要保持元素插入的顺序)并且还需要设置功能 - 防止重复。

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

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

      其他方法类似。

      我前段时间自己做过这个,但后来我找到了更好的解决方案:GlazedLists。 它是一个免费的图书馆,可以做这一切,甚至更多。我建议你使用UniqueList

      【讨论】:

        【解决方案5】:

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

        org.apache.commons.collections.list.SetUniqueListCommons-Collections

        【讨论】:

          猜你喜欢
          • 2023-04-01
          • 2021-05-29
          • 2018-05-29
          • 2016-07-08
          • 1970-01-01
          • 2015-10-31
          • 1970-01-01
          • 2016-10-18
          • 1970-01-01
          相关资源
          最近更新 更多