仅当arraylist中没有其他具有相同名称的项目时,如何添加项目?

时间:2015-04-27 17:31:12

标签: java arrays arraylist

如果项目与insertUniqueItem()方法中的arraylist中的其他项目名称不同,我将如何仅插入项目?

    public void insertUniqueItem()
    {

    }

    public static void main(String[] args)
    {
        ShoppingCart sc = new ShoppingCart();
        Item a = new Item("Kraft Cheese", 4, "\"Best Cheese in Town!\"");
        Item b = new Item("Bottle of Water", 2.50, "\"Refreshing Water!\"");

        sc.insertItem(a);
        sc.insertItem(b);

        sc.printInvoice();
        sc.insertUniqueItem();

        sc.print();

        DecimalFormat df = new DecimalFormat("#.00");

        System.out.println("Total Price: $" + df.format(sc.getTotal()));
    }
}

4 个答案:

答案 0 :(得分:7)

我可能会改用LinkedHashMap<String, Item>,其中键是项目的名称。那样:

  • 您仍然可以保留订购
  • 您可以轻松有效地检查是否已经存在给定项目名称的条目。

你有类似的东西:

if (!map.containsKey(item.getName()) {
    map.put(item.getName(), item);
}

这仅适用于您希望所有项目在名称方面唯一的情况。如果您有时想要允许重复的名称而有时不允许,那么您可能想要一个列表,然后您可能会有类似的内容:

boolean containsItemName(ArrayList<Item> items, String name) {
    for (Item item : items) {
        if (item.getName().equals(name)) {
            return true;
        }
    }
    return false;
}

如果您正在使用Java 8,则可以使用基于流的解决方案:

boolean containsItemName(ArrayList<Item> items, String name) {
    return items.stream().anyMatch(item -> item.getName().equals(name));
}

答案 1 :(得分:2)

您需要检查列表中是否已存在具有相同名称的项目:

public void insertUniqueItem(Item item) {
    if(!contains(item)) {
        cart.add(item);
    }
}

private boolean contains(Item item) {
    for(Item i : cart) {
        if(i.getName().equals(item.getName())) {
           return true;
        }
    }
    return false;
}

答案 2 :(得分:2)

您可以修改您的Item类,使其具有equals和hashcode方法,如下所示:

public class Item{

    private String name;


    public boolean equals(Object o){
        if (o instanceOf Item and ((Item)o).getName().compareTo(name) == 0){
            return true;
        }
        return false;
    }

    public int hashCode(){
        return name.hashCode();
    }

}

现在可以使用arrayList的contains方法来确定arrayList中是否存在具有相同名称的其他项目。

答案 3 :(得分:0)

我建议您在ShoppingCart中使用Set而不是List。 Set将管理您商品的独特性。确保在Item类

中使用equals方法覆盖