只给出一个属性,从ArrayList中删除一个对象

hel*_*rld 7 java casting arraylist object

我有一个项目的ArrayList,我希望能够通过只输入一个Item属性从列表中删除一个Item,例如它的数字(int ItemNumber).当我检查物品数量时,我也想做同样的事情.

这是我 equals()contains()方法,做我需要在这里做任何改变?

public boolean contains(T anEntry) {
    boolean found = false;
    for (int index = 0; !found && (index < numberOfEntries); index++) {
    if (anEntry.equals(list[index])) 
        found = true;
    }//end for
    return found;
} // end contains

public boolean equals(Object object){
    Item item = (Item) object;
    if (itemNo == item.itemNo)
        return true;
    return false;
}
Run Code Online (Sandbox Code Playgroud)

And*_*ira 6

如果更改类Item equals()compareTo()方法,以便它们只检查一个对象字段(例如a)quantity,则可能会导致应用程序的其他部分出现奇怪的行为.例如,具有不同itemNo,itemNameitemPrice,但具有相同数量的两个项目可被视为相等.此外,如果不equals()每次都更改代码,您将无法更改比较属性.

此外,创建自定义contains()方法毫无意义,因为它属于ArrayList类,而不是Item.

如果你可以使用Java 8,那么干净的方法就是使用new CollectionremoveIf方法:

假设您有一个Item包含numname属性的类:

class Item {
    final int num;
    final String name;

    Item(int num, String name) {
        this.num = num;
        this.name = name;
    }
}
Run Code Online (Sandbox Code Playgroud)

给定一个List<Item>被调用itemsint变量和一个变量number,表示要删除的项目的编号,您可以简单地执行:

items.removeIf(item -> item.num == number);
Run Code Online (Sandbox Code Playgroud)

如果您无法使用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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用比较器对列表中的所需元素进行排序和搜索:

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);

    // Pass a dummy object containing only the relevant attribute to be searched
    int index = Collections.binarySearch(items, new Item(5, ""), itemNumComparator);
    Item removedItem = null;
    // binarySearch will return -1 if it does not find the element.
    if (index > -1) {
        // This will remove the element, Item(5, "cow") in this case, from the list
        removedItem = items.remove(index);
    }
    System.out.println(removedItem);
}
Run Code Online (Sandbox Code Playgroud)

例如,要搜索名称等其他字段,您需要创建名称比较器并使用它来对列表中的二进制搜索进行排序和运行.

请注意,此解决方案有一些缺点.除非您完全确定自上次排序后列表没有更改,否则必须在运行该binarySearch()方法之前对其进行重新排序.否则,它可能无法找到正确的元素.排序的复杂性是O(nlogn),因此根据列表的大小,多次运行可能会非常昂贵.