我一直在努力研究这段代码,我认为必定会有一些我看不到的东西。这是我的班级及其#34;添加"功能。添加应该更新List并向计数器提供信息。可悲的是,HashMap没有响应,而List则没有。有任何想法吗?谢谢!
public class Basket {
private List<Product> products;
private HashMap<Product, Integer> counter;
public Basket(){
products = new LinkedList<Product>();
counter = new HashMap<Product, Integer>();
}
public void add(Product product){
products.add(product);
for(Product key : counter.keySet()){
if(product.getName() != key.getName()){
counter.put(product, 1);
}else{
counter.put(product, counter.get(product) +1);
}
}
}
答案 0 :(得分:1)
我在您的代码中看到了两个问题
1)您使用!=比较字符串(两个产品名称),这是不正确的。您必须使用String.equals()或String.equalsIngoreCase()
2)每次迭代地图中的元素时,您也会尝试增加产品的计数器。我很确定你只想做一次。
通过这些修复,你可以做这样的事情。 (注意:我在这个解决方案中使用了一个标签,但它的功能与布尔标志相同。它只是确保你遍历地图中的每个元素并确保产品在添加之前不存在)
public void add(Product product) {
products.add(product);
add: {
for (Product key : counter.keySet()) {
if (key.getName().equals(product.getName())) {
counter.put(key, counter.get(key) + 1);
break add;
}
}
counter.put(product, 1);
}
}
但是,理想情况下,您将覆盖Product中的.equals()和.hashCode()方法,然后您就可以使用HashMap.containsKey()方法,如下所示:
public void add(Product product) {
products.add(product);
if (counter.containsKey(product)) {
counter.put(product, counter.get(product) + 1);
} else {
counter.put(product, 1);
}
}
使用三元组也可以进一步简化:
public void add(Product product) {
products.add(product);
counter.put(product, counter.containsKey(product) ? counter.get(product) + 1 : 1);
}
答案 1 :(得分:-1)
您不需要在循环中执行此操作 - auth.CurrentUser.UserId, "true"
等等。
如果你想要的只是检查if(product.getName() != key.getName())
是否已经存在于地图中 -
如果不是,请将产品添加到地图中,并将计数器设置为1,如果是则将计数器增加1.
你可以这样做:
Product
if(counter.get(product) == null)
counter.put(product,1);
else
counter.put(product, counter.get(product)+1);
类的默认hashCode()方法将确保它知道它是否是正在添加的重复Product对象。
get()方法将返回特定对的Product
的值。
答案 2 :(得分:-1)
您的代码没有任何意义。您正在遍历密钥集,如果任何密钥不匹配,则表示您正在添加产品。您不需要遍历地图。看看吧:
public void add(Product product){
products.add(product);
Integer count = counter,get(product);
if (count == null) {
counter.put(product, 1);
}else{
counter.put(product, count+1);
}
}
NB同步也是必需的。