HashMap奇怪的问题 - 重复的对象

时间:2016-02-03 16:14:51

标签: java android data-structures hashmap

我有一个简单的应用程序,用于计算用户订购的内容。结果存储在主变量为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;
}

2 个答案:

答案 0 :(得分:2)

当您将对象放入HashMap时,它会使用对象的hashCodeequals方法来检测它的存储位置,以及它是否已被包含。如果您不实现这些方法,它将使用对象引用。这意味着两个不同的对象,即使它们存储完全相同的数据,也不会被认为是相同的。

如果您覆盖这两种方法,则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()方法 - 我会提供,但我需要更多关于该类的信息:/