如何删除和替换Java中的数组列表中的项目?
问题描述:
我在java中下面的代码,如何删除和替换Java中的数组列表中的项目?
import java.util.ArrayList;
import java.util.Objects;
public class Cars {
private static ArrayList<String> replaceDuplicates(ArrayList<String> aList) {
for (int i = 0; i < aList.size(); i++) {
for (int j = i + 1; j < aList.size(); j++) {
if (Objects.equals(aList.get(i), aList.get(j))) {
aList.remove(i);
aList.add(i, "");
aList.remove(j);
aList.add(j, "");
}
}
}
return aList;
}
public static void main(String[] args) {
ArrayList<String> cars = new ArrayList<>();
cars.add("Ford");
cars.add("Ford");
cars.add("Hyundai");
cars.add("Toyota");
cars.add("Toyota");
cars.add("Toyota");
cars.add("Ford");
cars.add("Honda");
cars.add("GMC");
System.out.println(cars);
cars = replaceDuplicates(cars);
System.out.println(cars);
}
}
这段代码的输出是 - [, , Hyundai, , , Toyota, Ford, Honda, GMC]
我希望替换多次出现与" "
数组列表汽车的名字。出于某种原因,在我的代码中,如果汽车的名字在数组列表中出现了三次,那么第三次出现不会被" "
取代。
我的期望输出应该是这样的 - [, , Hyundai, , , , , Honda, GMC]
什么我错在这里做什么?
预先感谢您!
答
首先:您可以使用List.set
来简化此代码,而不是插入和删除元素。
aList.remove(i);
aList.add(i, "");
只会成为
aList.set(i, "");
你删除这两个条目,如果他们重复。这导致总是删除偶数条目的行为。例如:
a b a a c a d a
b a c a d a #first pair removed
b c d a #second pair removed
如果元素的数量是奇数,那么列表中将始终保留一个元素。
显然你需要一些方法来记住要删除的元素。一个简单的方法,这将是使用一个标志来记住一个元素的副本是否遇到:
for (int i = 0; i < aList.size(); i++) {
//the flag
boolean duplicate = false;
for (int j = i + 1; j < aList.size(); j++) {
if (Objects.equals(aList.get(i), aList.get(j))) {
aList.set(j, ""); //remove all duplicates with an index higher than i
duplicate = true; //remember that element at index i is a duplicate
}
}
//remove last duplicate element
if(duplicate)
aList.set(i, "");
}
答
如果你还是想用你的方法,你可以修改列表之前创建你的项目引用:
for (int i = 0; i < aList.size(); i++) {
String a = aList.get(i);
for (int j = i + 1; j < aList.size(); j++) {
String b = aList.get(j);
if (Objects.equals(a, b)) {
aList.remove(i);
aList.add(i, "");
aList.remove(j);
aList.add(j, "");
}
}
}
只要您找到两两匹配,就清除两个匹配的名称。那么,你是在和以后的名字比较呢? –
你可以使用Set实例来达到这个目的 –
你想要的输出是什么?我猜的是'[,,现代,,,,本田,GMC]'',但从您的描述不确定。 – msandiford