在arraylist中查找重复值

Mak*_*kky 10 java search arraylist duplicates

我有一个 ArrayList<Car>

例如

class Car{
   String carName;
   int carType;
}
Run Code Online (Sandbox Code Playgroud)

现在,我必须找到列表中是否有任何具有相同名称的汽车.做这个的最好方式是什么?

Swa*_*rma 25

创建一个比较器:

public class CarComparator implements Comparator<Car>
{
    public int compare(Car c1, Car c2)
    {
        return c1.carName.compareTo(c2.carName);
    }
}
Run Code Online (Sandbox Code Playgroud)

现在将所有车辆添加ArrayList到a SortedSet,最好TreeSet; 如果有重复项添加到重复项列表:

List<Car> duplicates = new ArrayList<Car>();
Set<Car> carSet = new TreeSet<Car>(new CarComparator());
for(Car c : originalCarList)
{
    if(!carSet.add(c))
    {
        duplicates.add(c);
    }
}
Run Code Online (Sandbox Code Playgroud)

最后,duplicates你将获得所有重复项.

  • 为什么不使用`HashSet`.当你选择`TreeSet`为o(logn)时,它为所有操作提供o(1).我错了吗? (2认同)

Mar*_*lin 8

如果你有

class Car{
   String carName;
   int carType;
}
Run Code Online (Sandbox Code Playgroud)

List<Car> list;
Run Code Online (Sandbox Code Playgroud)

包含汽车列表,那么你可以有一个类似的方法

public static boolean hasDuplicates(List<Car> p_cars) {
    final List<String> usedNames = new ArrayList<String>();
    for (Car car : p_cars) {
        final String name = car.carName;

        if (usedNames.contains(name)) {
            return true;
        }

        usedNames.add(name);
    }

    return false;
}
Run Code Online (Sandbox Code Playgroud)

找出汽车列表是否有重复名称的汽车.


And*_*s_D 5

试试这个:

List<Car> cars = getCars();
Set<String> names = new HashSet<String>();
for (Car car:cars) {
  if (names.contains(car.getName()) {
    duplicate(car);   // some magic handler
  } else {
    names.add(car.getName());
  }
}
Run Code Online (Sandbox Code Playgroud)

注意:这将为您提供重复的汽车名称.接下来将从列表中提取具有这些名称的所有汽车(如果您需要Car对象)