所以我有一个存放物品的arraylist篮子,每个物品都是由物品名称和物品字段的价格组成的。 正如你所看到的那样,两种糖的价格相同。 我希望我的代码能够以重复的时间打印每一个项目。
我想要它做的是: 计算重复值
2 x Sugar for 100
1 x Cake for 75
1 x Salt for 30
1 x Fanta for 50
我的Item类toString方法是
public String toString(){
return name + " for " + price;
}
basket = new ArrayList<Item>();
basket.add(new Item("Sugar", 100));
basket.add(new Item("Sugar", 100));
basket.add(new Item("Cake", 75));
basket.add(new Item("Salt", 30));
basket.add(new Item("Fanta", 50));
HashSet<Item> set = new Hashset(basket)
for (Item item : set ){
System.out.println(Collections.frequency(basket, item) + " x" + item);
}
但它的作用是......
1 x Sugar for 100
1 x Sugar for 100
1 x Cake for 75
1 x Salt for 30
1 x Fanta for 50
所以我认为它比较了toStrings但重复的那些并不等于真。
请帮忙。
这是我的第一篇文章,并且不太了解发布的确切规则
答案 0 :(得分:1)
在这种情况下使用Map会更好。首先,确保在 Item 对象中实现 equals(Object)和 hashCode()方法,然后将每个唯一使用基本值为1的AtomicInteger值将项目放入地图中。在放入地图中的对象之前,应检查以确保该项目尚未在地图中,如果该项目已存在于地图中,获取AtomicInteger并递增它。
像这样......
Map<Item, AtomicInteger> quantitiesByItem = new HashMap<>();
for (Item item : listOfItems) {
if (!quantitiesByItem.contains(item)) {
quantitiesByItem.put(item, new AtomicInteger(1));
} else {
quantitiesByItem.get(item).incrementAndGet();
}
}
HashSet实际上可以防止重复,因此仅在您尝试删除重复记录的情况下才有用。
编辑:您也可以使用Collections.frequency但是您需要在Item对象中实现 equals(Object)和 hashCode(),否则确定对象是不同,因为它们不是完全相同的对象。您还需要停止将列表中的所有值添加到集合中,而只需将List对象传递给Collections.frequency方法。
答案 1 :(得分:0)
这是我的Item类中缺少的代码; 您需要覆盖默认情况下每个对象具有的equals和hashcode方法。这将允许您按状态比较两个对象。 对象A与私有字段,例如int字段和String字段 使用对象B.如果两个字段相同,则返回值为true
Print 2