2013-01-09 95 views
0

删除选定的项目我有哪里的产品加入并为每个产品有一个删除按钮篮子:使用链接的哈希映射

example

每当我点击底部的按钮,它会删除底部产物,问题是它也删除最上面的项目,当点击顶部的按钮,直到数量为0,物品消失它删除底部的第二个(在这种情况下,第一项)

这是我的篮子班级代码:

package model; 

import java.util.ArrayList; 
import java.util.Collections; 
import java.util.LinkedHashMap; 
import java.util.LinkedList; 
import java.util.List; 
import java.util.Map; 
import java.util.Map.Entry; 
import java.util.Observable; 
import main.WinkelApplication; 
import view.Payment; 

public class Basket extends Observable { 

    private final Map<Product, Integer> products; 

    public Basket() { 
     super(); 
     products = new LinkedHashMap<Product, Integer>(); //Map zorgt ervoor dat keys??? aan values word gebonden (dit is een soort van variabele[i], i staat voor de key 
    } 

    public void addProduct(Product product) { 
     // check if product is allready added to the basket 
     if (products.containsKey(product)) { 
      products.put(product, products.get(product) + 1); 

     } else { 
      products.put(product, 1); 
     } 
     setChanged(); 
     notifyObservers(); 
    } 

    public void deleteProduct(Product product) { 
     // check if product is allready added to the basket 
     int i = WinkelApplication.getBasket().getProductAmount(product); 
     int id = product.getProductId(); 


     if (WinkelApplication.getBasket().getProductAmount(product) == 1) { 

      products.remove(product); 
      WinkelApplication.getInstance().showPanel(new view.Payment()); 

     }else{ 
      i--; 
      products.put(product, i); 
      WinkelApplication.getInstance().showPanel(new view.Payment()); 
     } 

     if (products.size() == 0) { 
      WinkelApplication.getInstance().showPanel(new view.CategoryList()); 
     } 
    } 

    public void empty() { 
     products.clear(); 
     setChanged(); 
     notifyObservers(); 
    } 

    public List<Product> getProducts() { 
     List<Product> list = new LinkedList<Product>(products.keySet()); 
     return list; 
    } 

    public int getProductAmount(Product product) { 
     return products.get(product); 
    } 

    public int size() { 
     return products.size(); 
    } 

    public double getTotalCosts() { 
     double total = 0.0; 
     for (Entry<Product, Integer> entry : products.entrySet()) { //gaat de lijst van producten af in basket, en doet de prijs bij totaal * het hoeveelheid van zo'n product 
      total += entry.getKey().getPrice() * entry.getValue(); 
     } 
     return total; 
    } 
} 

在deleteProduct方法中,我做了products.remove(product),所以我假设它接受最后一个项目,如果我将它显示给我的哈希映射系统:{Cars = 2,Dames onderbroek = 1} (根据上图)。我怎样才能确保它删除所选的一个而不是列表中的最后一个?

产品类:

package model; 

public class Product { 

    private int productId; 
    private int categorieId; 
    private String name; 
    private String description; 
    private double price; 

    public Product() { 
     this(-1, -1, "", "", 0.0); 
    } 

    public Product(int product_id, int categorie_id, String name, String description, double price) { 
     this.productId = product_id; 
     this.categorieId = categorie_id; 
     this.name = name; 
     this.description = description; 
     this.price = price; 
    } 

    /** 
    * @return the productId 
    */ 
    public int getProductId() { 
     return productId; 
    } 

    /** 
    * @param productId the productId to set 
    */ 
    public void setProductId(int productId) { 
     this.productId = productId; 
    } 

    /** 
    * @return the name 
    */ 
    public String getName() { 
     return name; 
    } 

    /** 
    * @param name the name to set 
    */ 
    public void setName(String name) { 
     this.name = name; 
    } 

    /** 
    * @return the description 
    */ 
    public String getDescription() { 
     return description; 
    } 

    /** 
    * @param description the description to set 
    */ 
    public void setDescription(String description) { 
     this.description = description; 
    } 

    /** 
    * @return the price 
    */ 
    public double getPrice() { 
     return price; 
    } 

    /** 
    * @param price the price to set 
    */ 
    public void setPrice(double price) { 
     this.price = price; 
    } 

    /** 
    * @return the categorieId 
    */ 
    public int getCategorieId() { 
     return categorieId; 
    } 

    /** 
    * @param categorieId the categorieId to set 
    */ 
    public void setCategorieId(int categorieId) { 
     this.categorieId = categorieId; 
    } 

    @Override 
    public String toString() { 
     return name; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     boolean value; 
     if (obj instanceof Product) { 
      value = this.productId == ((Product)obj).productId; //VB: product1 (met ID 1) past deze methode toe, en geeft product2 als parameter: deze method geeft dan false terug. 
     } else { 
      value = super.equals(obj); //van wat is Product een subclass van? en wat heeft dit voor nut? 
     } 
     return value; 
    } 

    @Override 
    public int hashCode() { //wth is dit? 
     return 13 * 3 + this.productId; 
    } 
} 
+0

显示'Product'类。你是否覆盖'equals'和'hashCode'? – home

+0

删除这个无用的评论! – MrSmith42

+0

您应该编写一些单元测试并调试问题... – home

回答

1

不幸的是,你还没有给我们送来类Product但我可以假设你已经不是这个类实现hashCode()equals()

简短的回答 - 做到这一点,你的逻辑将起作用。

较长的答案是散列机制使用这些方法来识别您的对象。默认情况下,hashCode()返回java堆中的“地址”,因此即使所有字段相同,Product的2个不同实例也不相同。请注意,如果equals()返回true,则hashCode()必须为这两个对象返回相同的值。

+0

添加了产品类别!希望你能更好地帮助我。 – DaViDa

0

WinkelApplication.getBasket()也许提供另一个篮子?

没有答案,但当产品不在products中时可能会出现错误。

public int getProductAmount(Product product) { 
    Integer i = products.get(product); 
    return i == null ? 0 : i.intValue(); 
}