哈希图奇怪的问题 - 重复的对象



我有一个简单的应用程序,可以计算用户订购的内容。存储在主变量LinkedHashMap<Product, Integer> - Integer 的 singleton 对象中的结果保存产品订购次数。:

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格式来自服务器,然后解析和创建对象。产品解析

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;
}

但在这里我面临一个奇怪的问题:当我从啤酒活动中添加一些产品(比如啤酒)时,我可以按预期添加和删除它们,但是当我转到另一个类别 - (另一个活动) - 然后返回啤酒活动并添加我已经添加的相同产品 - HashMap 无法识别这些对象, 并将它们添加为新的,而不是增加整数。
请帮助我解决此问题,任何其他代码片段都将根据需要附加。

a 产品对象 :

public class Product {
    private Integer id;
    private Integer companyId;
    private Integer categoryId;
    private String title;
    private String price;
    private boolean isExpanded = false;
    public Product(){
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getPrice() {
        return price;
    }
    public void setPrice(String price) {
        this.price = price;
    }
    public boolean isExpanded() {
        return isExpanded;
    }
    public void setIsExpanded(boolean isExpanded) {
        this.isExpanded = isExpanded;
    }
}

下面是您可以调整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()方法 - 我会提供,但我真的需要有关该类的更多信息:/

最新更新