从ArrayList

时间:2016-03-17 00:53:22

标签: java arraylist duplicates

他们的预建方法是否与removeAll的工作方式不同,可以删除数组列表中的所有某个值?

我有一种删除arrayLists中重复项的方法,如下所示:

for循环的前2个工作并正确设置但我不知道如何为第二个for循环删除ArrayList中的所有值-1或者他们是更好的方法吗?

public static ArrayList<Integer> deleteDuplicates(ArrayList<Integer> a) {    
    for (int i = 0; i < a.size(); i++) {
      for (int j = (i + 1); j < a.size(); j++) { 
        if (a.get(i) == a.get(j) && i != j) {
          a.set(j, -1); 
        }
      }
    }
    for (int i = 0; i < a.size(); i++) {
      if (a.get(i) == -1) {
        a.removeAll(int -1);
      }
    }

底部的removeAll(int -1)内容无法编译,我只是将其留在那里,以便您可以看到我想要做的事情。

编辑:

替换了底部的for循环:

  for (int i = 0; i < a.size(); i++) {
      if (a.get(i) == -1) {
        a.remove(i);
        i--;
      }
    }

非常确定有效。

2 个答案:

答案 0 :(得分:1)

可能效率较低但更易读的方法是使用Set来过滤重复项:

public static ArrayList<Integer> deleteDuplicates(ArrayList<Integer> a) {
   return new ArrayList<Integer>(new TreeSet<Integer>(a));
}

对于大多数情况,如非常大的列表,这将是一个更好的选择。

根据该选项,您可以通过将初始ArrayList声明为ArrayList<Integer>来避免将Set<Integer>全部转换为一起。如果是这样,这种方法就没必要了。

答案 1 :(得分:0)

正如其他人所指出的那样,最优雅的方式是使用Set;它会自动处理重复值。

我甚至更进一步:如果您可以控制输入数据......那么根本不要使用ArrayList。首先用值填充列表只是浪费内存和CPU周期;然后将其转换为Set以消除重复;然后再将其转换为列表。您无需创建新对象。

相反:从头开始使用一组。因此,如果可能的话,更改&#34;收到的代码&#34;输入数据直接存储在一个集合中。

(旁注:不同的集合类,如HashSet,ArrayList,......对于不同类型的操作有不同的&#34;成本&#34;从这个意义上说,你可能想要检查这个question确定哪种收集类型最符合您的需求)