我有一个简单的应用程序,用于计算用户订购的内容。结果存储在主变量为singleton
的{{1}}对象中 - 整数保持产品订购的次数。 :
LinkedHashMap<Product, Integer>
我的应用中有一个Product类和一个Category类。所有数据都以public static synchronized Order getInstance() {
if (INSTANCE == null)
INSTANCE = new Order();
return INSTANCE;
}
private LinkedHashMap<Product, Integer> order;
private Order() {
order = new LinkedHashMap<>();
}
//adding product to order
public void addToOrder(Product p) {
if (order.containsKey(p)) {
Integer i = order.get(p);
i = i + 1;
order.put(p, i);
} else {
order.put(p, 1);
}
}
//removing item from order
public void removeFromOrder(Product p) {
if (order.containsKey(p)) {
Integer i = order.get(p);
i = i - 1;
if (i == 0) {
order.remove(p);
} else {
order.put(p, i);
}
}
}
格式来自服务器,而不是解析和创建的对象。
产品解析
JSON
但是我在这里面临一个奇怪的问题:当我从Beers活动中添加一些产品(比如啤酒)时,我可以按预期添加和删除它们,但是当我转到另一个类别 - (另一个活动) - 然后回到啤酒活动并添加我已经添加的相同产品 - HashMap无法识别这些对象,并将它们添加为新的而不是增加整数。
请帮我解决这个问题,其他任何代码都会在需求时附上。
产品对象:
private List<Product> parseJson(JSONObject productsJson) throws JSONException {
List<Product> list = new ArrayList<>();
JSONArray productsArray = (JSONArray) productsJson.get("products");
for(int i=0; i<productsArray.length(); i++){
Product p = new Product();
p.setTitle(((JSONObject)productsArray.get(i)).get("title").toString());
p.setPrice(((JSONObject)productsArray.get(i)).get("price").toString());
list.add(p);
}
return list;
}
答案 0 :(得分:2)
当您将对象放入HashMap
时,它会使用对象的hashCode
和equals
方法来检测它的存储位置,以及它是否已被包含。如果您不实现这些方法,它将使用对象引用。这意味着两个不同的对象,即使它们存储完全相同的数据,也不会被认为是相同的。
如果您覆盖这两种方法,则Map
会正确跟踪您已有的方法。
答案 1 :(得分:1)
以下是您可以调整的示例hashCode()
实施
public int hashCode() {
//return super.hashCode();
int result = 13;
result = 31 * result + ( silent ? 1 : 0); //silent is boolean
result = 31 * result + msgenum; //msgenum is int
result = 31 * result + type; //type is int
result = 31 * result + from.hashCode(); //these three are objects
result = 31 * result + val.hashCode(); //they have valid hashCode()
result = 31 * result + msg.hashCode();
return result;
}
至于样本equals()
方法 - 我会提供,但我需要更多关于该类的信息:/