上课时候的一个小例子,是个网上书店。书都是放在TreeMap里的,通过迭代显示在页面上,在购物车一个页面里有删除的按钮,但是每次删除时候只能倒序的删除,也就是说第一次买BOOK A,第二次买BOOK B, 第三次买BOOK C,购买以后跳转到该购物车页面后选中一本书删除,只有按照CBA的方法才能正确删除,如果直接选择B或A的话会报异常,(虽然报异常了,但是其实该书也已经被删除了),请问是什么原因?删除的servlet代码如下:
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
int id = Integer.parseInt(req.getParameter("id"));
int amount =Integer.parseInt(req.getParameter(req.getParameter("id")));
HttpSession session = req.getSession();
Map sessionmap = (TreeMap)session.getAttribute("cartList");
Set set = sessionmap.keySet();
Iterator it = set.iterator();
while(it.hasNext()){
int id2 = (Integer)it.next();
if(id==id2){
sessionmap.remove(id);
}
}
req.getRequestDispatcher("/ListCart.jsp").forward(req,resp);
}

请指教。。

解决方案 »

  1.   

    你在迭代一个集合的过程中,不要调用集合的remove方法删除对象.
    而是要调用迭代器Iterator.remove.
    Iterator it = set.iterator();
    while(it.hasNext()){
       int id2 = (Integer)it.next();
       if(id==id2){
         it.remove();
       }
    }
      

  2.   

    又看了一下你的代码,不知道你为什么还要迭代比较id? id就是那个treeMap的key啊?你直接sessionmap.remove(id)即可.如果返回null则表示没有这个id
    你好好看看JDK吧
      

  3.   

    主要我KEY的ID也就是BOOK的ID,所以比较一下