[英]java HashMap not updating integer value for a specific key
package cdlKata;
import java.util.HashMap;
import java.util.Map;
class Item2 {
private String s;
public Item2(String s) { this.s = s; }
public String getS() { return s; }
}
class Basket2 {
private Map<Item2, Integer> items;
public Basket2() { items = new HashMap<>(); }
public Map<Item2, Integer> getItems() { return items; }
public void addItemToBasket(Item2 item) {
items.put(item, items.getOrDefault(item,0) + 1);
}
public void printBasket() {
items.entrySet().forEach(e->{ System.out.println(e.getKey().getS() + " " + e.getValue());});
}
}
public class Main2 {
public static void main(String[] args) {
Basket2 basket;
basket = new Basket2();
basket.addItemToBasket(new Item2("A"));
basket.addItemToBasket(new Item2("A"));
basket.printBasket();
}
}
结果是:
一个 1
一个 1
篮子大小= 2。我想要的是:
A2
篮子尺寸 1。
如果我将 Item2 变成 String 我没有问题。 不明白为什么它不起作用。
您创建了两个不同的实例,如下所示
basket.addItemToBasket(new Item2("A"));
basket.addItemToBasket(new Item2("A"));
你期望它是平等的。 情况不会如此。
您必须覆盖hashcode
和equals
根据 HashMap 的工作逻辑,你必须重写你的键的 hashcode() 和 equals() 方法。 PS 另外,我建议您在这种情况下使用 map 的合并方法而不是 put。
map.merge(key, 1, Integer::sum)
由于您使用的是 Map 的 object,Integer Z78E6221F6393D1356681DB398F14CED6
一个 1
一个 1
是正确的,但你期待 output: A 2
为此,您需要创建 Map 的字符串,Integer 即。 item2.getS() 和 Integer 的 map。
它不起作用的原因是因为您映射了 object 和 Integer,并且您每次都通过创建新对象将项目添加到购物篮。
因此,解决方案将是这样的。
package cdlKata;
import java.util.HashMap;
import java.util.Map;
class Item2 {
private String s;
public Item2(String s) { this.s = s; }
public String getS() { return s; }
}
class Basket2 {
private Map<String, Integer> items;
public Basket2() { items = new HashMap<>(); }
public Map<String, Integer> getItems() { return items; }
public void addItemToBasket(Item2 item) {
items.put(item.getS(), items.getOrDefault(item.getS(),0) + 1);
}
public void printBasket() {
items.entrySet().forEach(e->{ System.out.println(e.getKey() + " " + e.getValue());});
}
}
public class Stack {
public static void main(String[] args) {
Basket2 basket;
basket = new Basket2();
basket.addItemToBasket(new Item2("A"));
basket.addItemToBasket(new Item2("A"));
basket.printBasket();
}
}
好吧...您在 class 中缺少 equals/hashCode。
有关更多信息,请参阅此答案: 为什么我需要覆盖 Java 中的 equals 和 hashCode 方法?
对于您的 class 只需定义这些方法:
class Item2 {
private String s;
public Item2(String s) { this.s = s; }
public String getS() { return s; }
@Override public boolean equals(Object o)
{
if (this == o)
return true;
if (o == null || getClass() != o.getClass())
return false;
Item2 item2 = (Item2) o;
return s != null ? s.equals(item2.s) : item2.s == null;
}
@Override public int hashCode()
{
return s != null ? s.hashCode() : 0;
}
}
是使用 hash 的常见错误。 您应该为项目 class 实现 hashCode 和 equals。
class Item2 {
private String s;
public Item2(String s) { this.s = s; }
public String getS() { return s; }
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Item2)) return false;
Item2 item2 = (Item2) o;
return Objects.equals(getS(), item2.getS());
}
@Override
public int hashCode() {
return Objects.hash(getS());
}
}
没有那个,HashMap 会认为两个对象(即使是相同的值)是不同的,因此,它将作为一个新的 Object。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.