0

商品が追加されるバスケットがあり、商品ごとに削除ボタンがあります。

例

一番下のボタンをクリックすると一番下の製品が削除されますが、問題は、一番上のボタンをクリックすると、金額が0になるまで最後のアイテムも削除され、アイテムがなくなると、一番下の2番目のアイテムが削除されます(この場合、最初の項目)

これが私のバスケットクラスのコードです:

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

2 に答える 2

1

残念ながら、あなたは私たちにクラスを送ってくれませんでしたが、あなたはこのクラスに対して を実装しProductていないと推測できます。hashCode()equals()

短い答え - これを行うと、ロジックが機能します。

より長い答えは、ハッシュメカニズムがこれらのメソッドを使用してオブジェクトを識別するというものです。デフォルトでhashCode()は、Java ヒープの「アドレス」を返すため、Productすべてのフィールドが等しい場合でも、2 つの異なるインスタンスは異なります。equals()truehashCode()を返す場合は、両方のオブジェクトに対して等しい値を返す必要があることに注意してください。

于 2013-01-09T18:34:46.883 に答える
0

WinkelApplication.getBasket()たぶん別のバスケットを届けますか?

回答ではありませんが、製品が入っていない場合にエラーが発生する可能性がありますproducts

public int getProductAmount(Product product) {
    Integer i = products.get(product);
    return i == null ? 0 : i.intValue();
}
于 2013-01-09T19:14:53.943 に答える