我有一个包含多个购物商品条目的ArrayList,包括名称,ID和制造商。我已经看过hashmaps和Collection.frequency但我不确定如何正确使用它们。
例如,当我想查看此人购物车的内容时,它目前以以下格式显示内容:
item id:12345 | red t-shirt | Brand 1 | $30.00
item id:54321 | blue t-shirt | Brand 2 | $35.00
item id:12345 | red t-shirt | Brand 1 | $30.00
我想列出该ArrayList中的所有项目,但将这些条目显示为:
item id:12345 | red t-shirt | Brand 1 | $30.00 | x2
item id:54321 | blue t-shirt | Brand 2 | $35.00 | x1
有人可以指出我正确的方向,我如何获取ArrayList中每个项目的数量,并显示每个项目的数量?
答案 0 :(得分:1)
您应该拥有以下课程:
然后您的购物车可以简单地实现为List<CartItem>
,或者,如果您希望能够快速更改给定产品ID的数量,则为Map<Long, CartItem>
,其中密钥是产品ID,值是此产品的CartItem:
public void addProductInCart(Product product, int quantity) {
CartItem item = map.get(product.getId());
if (item == null) {
item = new CartItem(product, quantity);
map.put(product.getId(), item);
}
else {
item.addQuantity(quantity);
}
}
答案 1 :(得分:0)
答案 2 :(得分:-1)
要解决您的问题,您应该按照以下步骤操作。
创建一个名为Item的类,并正确覆盖equals和hashCode。
public class Item {
private Integer id;
private String name;
private String brand;
private Double price;
public Item(Integer id, String name, String brand, Double price) {
//...
}
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (!(obj instanceof Item)) {
return false;
}
Item other = (Item) obj;
return this.id.equals(other.id)
&& this.name.equals(other.name)
&& this.brand.equals(other.brand)
&& this.price == other.price;
}
@Override
public int hashCode() {
return 31 * this.id.hashCode()
+ this.name.hashCode()
+ this.brand.hashCode()
+ this.price.hashCode();
}
@Override
public String toString() {
return String.format("item id:%d | %s | %s | $%f",
id, name, brand, price);
}
}
创建一个HashMap来计算列表中的项目。
Map<Item, Integer> map = new HashMap<>();
List<Item> list = new ArrayList<>();
list.add(new Item(12345, "red t-shirt", "Brand 1", 30.00));
list.add(new Item(54321, "blue t-shirt", "Brand 2", 50.00));
list.add(new Item(12345, "red t-shirt", "Brand 1", 30.00));
for (Item item : list) {
Integer count = map.get(item);
map.put(item, count == null ? 1 : count + 1);
}