如何删除和替换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]

什么我错在这里做什么?

预先感谢您!

+2

只要您找到两两匹配,就清除两个匹配的名称。那么,你是在和以后的名字比较呢? –

+2

你可以使用Set实例来达到这个目的 –

+0

你想要的输出是什么?我猜的是'[,,现代,,,,本田,GMC]'',但从您的描述不确定。 – msandiford

首先:您可以使用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, ""); 
     } 
    } 
}