如果项目与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()));
}
}
答案 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方法覆盖