0

Java/HTML プロジェクトに取り組んでいます。セッション属性としてハッシュマップを設定しました。セッションからハッシュマップをリクエストし、キー/値を入れます map.put("some string", "1") 。このアクションが 2 回目に実行されると、ハッシュマップの内容が出力され、ハッシュマップの最後の操作の後に「1」だった唯一の値が「-1」になります。

私の意見では、Hashmap はこのプロジェクトに最適なデータ構造です。誰でも助けることができますか?

public class Cart {
    private HashMap<String, asd> list;

    public Cart(){
        list = new HashMap<String, asd>();
    }

    public HashMap<String, asd> getMap(){
        return list;
    }

    /*
     * Parameter: code
     *      -1: increase quantity by 1
     *      0: delete product from the product list
     *      else: set the product quantity to the passed value
     */
    public void alterProduct(int code, String product){
        if(list.containsKey(product)) {
            if(code == -1) plusOne(product);
            if(code == 0) remove(product);
            else setValue(product, code);
        }else {
            asd asd = new asd();
            asd.a = 1;
            list.put(product, asd);
        }
    }

    private void plusOne(String product){
        asd asd = list.get(product);
        asd.a = asd.a + 1;
        list.put(product, asd);
    }

    private void remove(String product){
        list.remove(product);
    }

    private void setValue(String product, int code){
        asd asd = new asd();
        asd.a = code;
        list.put(product, asd);
    }
}

class asd{
    int a;

    public String toString(){
        return ""+a;
    }
}

Cartオブジェクトをセッション属性として設定した JSP コード:

<%
    Cart myCart = new Cart();
    session.setAttribute("cart",myCart);
%>

サーブレット コード:

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        Cart cart = (Cart) request.getSession().getAttribute("cart");
        cart.alterProduct(-1, (String) request.getSession().getAttribute("name"));
        doGet(request, response);
    }

alterProduct同じキーを2 回呼び出した後(String) request.getSession().getAttribute("name")、同じキーのハッシュマップ値は「-1」です。

4

1 に答える 1

1

製品のタイプ/価値は何ですか? 「カート」にどのように接続されていますか?

データ型を台無しにするとどうなるのかと思います。別のオプションは、メソッドにバグがあることCart.toString()です。コードを「プレーン」データ型に変更して、再確認することをお勧めします。失敗した場合は、煩雑な変換を行わずに Cart クラスを使用し、コードをデバッグします。

ここにバグがあります:

  public void alterProduct(int code, String product){
    if(list.containsKey(product)) {
      if(code == -1) plusOne(product);
      if(code == 0) remove(product);
      else setValue(product, code);
  }


  private void setValue(String product, int code){
    asd asd = new asd();
    asd.a = code;
    list.put(product, asd);
  }

2 回目に電話をかけたときに何が起こるかを考えてみましょうart.alterProduct(-1, "something")list.containsKey(product)が真 (同じ製品を使用している) の場合、コードは -1 です。

if(code == -1) plusOne(product);期待どおりに実行されます。

しかし、その後、あなたは何かおかしくなっています

if(code == 0) remove(product); else setValue(product, code);

code ==0は false と評価されるため、else 命令が呼び出されます。あなたが呼んでいますsetValue(product, -1)

上記でわかるように、setValue は、観測された asd.a に -1 を割り当てます。

于 2012-05-09T07:54:12.130 に答える