他们的预建方法是否与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--;
}
}
非常确定有效。
答案 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确定哪种收集类型最符合您的需求)