【问题标题】:method to delete an element from two lists从两个列表中删除元素的方法
【发布时间】:2019-09-14 21:30:38
【问题描述】:

有 3 个班级。房屋、汽车和物品清单

汽车类

public class Car
{
    private int id;
    private String colour;

    public Car(int id, String colour)
    {
        this.id = id;
        this.colour = colour;
    }

    public String getColour() //accessor method
    {
        return colour;
    }

    public int getId() //accessor method
    {
        return id;
    }

    public void setId(int id) // mutator method
    {
        this.id = id;
    }

    public void setColour(String colour) // mutator method
    {
        this.colour = colour;
    }

}

家庭类

public class House
{
    private int number;
    private String colour;

    public House(int number, String colour)
    {
        this.number = number;
        this.colour = colour;

    }

    public String getColour() //accessor method
    {
        return colour;
    }

    public int getNumber() //accesor
    {
        return number;
    }

    public void setNumber(int number) // mutator method
    {
        this.number = number;
    }

    public void setColour(String colour)
    {
         this.colour = colour;
    }

}

项目清单类

import java.util.ArrayList;
import java.util.List;
public class ItemList
{
    private ArrayList<Car> cars;
    private ArrayList<House> houses;

    public ItemList()
    {
        cars = new ArrayList<Car>();
        houses = new ArrayList<House>();
    }

    public void addCar(int id, String colour)
    {
        Car myCar = new Car(id,colour);
        cars.add(myCar);

        //cars.add(new Car(id,colour)); one-liner

    }
    public void addHouse(int number, String colour)
    {
        House myHouse = new House(number,colour);
        houses.add(myHouse);
    }

我正在尝试创建一种方法,通过输入数字和颜色(采用 2 个参数,int 和 String)从两个列表(汽车和房屋)中删除项目/元素 - 将搜索列表,如果它找到具有匹配整数和字符串值的对象将从列表中删除对象。

到目前为止我想出了这个

public void deleteByItem(int value, String colour)
    {
        Car car = new Car(value,colour);
        House house = new House(value,colour);
        boolean bCar = searchCarByItem(car);
        boolean bHouse = searchHouseByItem(house);
        if (bCar)
        {
           cars.remove(car);

        }
        if (bHouse)
        {
            houses.remove(house);

        }

    }

【问题讨论】:

  • 你遇到了什么问题?
  • 请问您为什么要删除具有相同 id 和颜色的房屋和汽车……这对我来说真的没有意义。如果它是一个学习示例,它看起来有点奇怪,如果它是你真正使用的东西,你可能需要重新考虑你的数据结构。

标签: java


【解决方案1】:
public void deleteByItem(int value, String colour) {
    cars.removeIf(car -> car.getId() == value && Objects.equals(car.getColour(), colour));
    houses.removeIf(house -> house.getNumber() == value && Objects.equals(house.getColour(), colour));
}

【讨论】:

【解决方案2】:
public void deleteByItem(int value, String colour)
{
     for(Car car: cars) {
         if (car.getId() == value && car.getColour().equals(colour)) {
             cars.remove(car);
         }
     }

     for(House house: houses) {
         if (house.getNumber() == value && house.getColour().equals(colour)) {
             houses.remove(house);
         }
     }
}

您可以简单地循环考虑数组列表,直到找到匹配的列表并将其从数组列表中删除。 mine 被实施以删除所有匹配项,而不仅仅是第一个匹配项。因此,如果您只想删除第一个,则只需进行以下修改

public void deleteByItem(int value, String colour)
{
     for(Car car: cars) {
         if (car.getId() == value && car.getColour().equals(colour)) {
             cars.remove(car);
             break;
         }
     }

     for(House house: houses) {
         if (house.getNumber() == value && house.getColour().equals(colour)) {
             houses.remove(house);
             break;
         }
     }
}

【讨论】:

  • 不会删除 for-each 循环中的元素导致ConcurrentModificationException
  • 虽然使用索引进行循环可能是这种情况,但是当您使用可迭代的形式进行循环时,这不会发生,所以你很好!
  • 即使它可以工作,在这里使用 for-each 循环也是不好的编程习惯......您正在搜索列表中的元素,然后 java 再次搜索您的项目以删除它。因此,应该使用删除普通迭代器 - 更快更安全!
  • @zzimick From Java's ArrayList Documentation: "如果列表在迭代器创建后的任何时间被结构性修改,除了通过迭代器自己的 remove 或 add 方法外,迭代器将抛出 ConcurrentModificationException 。”在我看来,这段代码不起作用,当我自己测试它时,我确实得到了ConcurrentModificationException
猜你喜欢
  • 2022-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多