如果您更改
Item
类的
equals()
和
compareTo()
方法,使其仅检查一个对象字段,例如
quantity
,则可能会导致应用程序的其他部分出现奇怪的行为。例如,两个具有不同
itemNo
、
itemName
和
itemPrice
,但具有相同数量的物品可能被认为是相等的。此外,您将无法在不每次更改
equals()
代码的情况下更改比较属性。
此外,创建自定义
contains()
方法没有意义,因为它属于
ArrayList
类,而不是
Item
类。
如果您可以使用Java 8,则一种清洁的方法是使用新的
Collection
的
removeIf
方法:
假设您有一个具有
num
和
name
属性的
Item
类:
class Item {
final int num;
final String name;
Item(int num, String name) {
this.num = num;
this.name = name;
}
}
假设有一个名为items
的List<Item>
以及一个名为number
的int
变量,代表你想要移除的项目编号,你可以简单地执行以下操作:
items.removeIf(item -> item.num == number);
如果您无法使用Java 8,您可以通过使用自定义比较器、二分查找和虚拟对象来实现此目的。
您可以为每个需要查找的属性创建一个自定义比较器。对于
num
的比较器将如下所示:
class ItemNumComparator implements Comparator<Item> {
@Override
public int compare(Item a, Item b) {
return (a.num < b.num) ? -1 : ((a.num == b.num) ? 0 : 1);
}
}
然后,您可以使用比较器对列表中的所需元素进行排序和搜索:
public static void main(String[] args) {
List<Item> items = new ArrayList<>();
items.add(new Item(2, "ball"));
items.add(new Item(5, "cow"));
items.add(new Item(3, "gum"));
Comparator<Item> itemNumComparator = new ItemNumComparator();
Collections.sort(items, itemNumComparator);
int index = Collections.binarySearch(items, new Item(5, ""), itemNumComparator);
Item removedItem = null;
if (index > -1) {
removedItem = items.remove(index);
}
System.out.println(removedItem);
}
要搜索另一个字段,比如姓名,你需要创建一个姓名比较器并使用它来对列表进行排序和运行二分搜索。
请注意,这种解决方案也有一些缺点。除非你完全确定列表自上次排序以来没有改变,否则在运行
binarySearch()
方法之前,你
必须重新对其进行排序。否则,它可能无法找到正确的元素。排序复杂度为
O(nlogn)
,因此根据列表的大小多次运行它可能会变得相当昂贵。