remove方法从第一个列表中删除项目,但不从其他列表中删除

时间:2015-10-23 14:50:38

标签: java list dictionary methods

我的删除方法中有这个问题,我不太明白。

执行此方法时,它会遍历第一个map(titleMap)并从该映射中删除book item的标题,但不会继续执行另外两个迭代器。

书籍商品有标题,卖家和价格。每个属性都有一个地图:titleMap,sellerMap,priceMap。我希望能够删除完整的图书项目,因此从titleMap中删除图书的标题,从sellerMap中删除卖家,从priceMap中删除价格。

我试图将三个迭代器合并在一起,但无济于事。如果有人能帮我找到理由,那会很棒。感谢。

输入:

ListMultiIndex list = new ListMultiIndex();
    list.add("ONE", "Chris", 2);
    list.add("TWO", "Bob", 35);
    list.add("THREE","David", 100);
    list.displaySizeOfList();

    try {
        list.remove(new BookItem ("THREE","David", 100));
        list.remove(new BookItem ("TWO", "Bob", 35));
    } catch (BookStoreException e){
        e.printStackTrace();
    }
    list.displaySizeOfList();

输出:

titleMap的大小为:3
卖家地图的大小是:3
priceMap的大小是:3
book删除(通过titleMap)标题名称:THREE
book删除(通过titleMap)标题名称:TWO
titleMap的大小是:1
卖家地图的大小是:3
priceMap的大小是:3

无错误的输出应如下所示:

titleMap的大小为:1
卖家地图的大小是:1
priceMao的大小是:1

方法:

@Override
public void remove(IBookItem book) throws BookStoreException{

                boolean isRemoved = false;

    for(BookEntry<String,ArrayList<BookItem>> entry : titleMap){
        if(entry.getKey().equals(book.getTitle())){
            if(entry.getValue().contains(book)) {
                entry.getValue().remove(book);
                System.out.println("book Removed (via titleMap)with title name: " + book.getTitle());
                if(entry.getValue().isEmpty()) {
                    isRemoved = true;
                    System.out.println("book removed (titlemap)");
                    titleMap.remove(entry);
                }
            }
        }
    }   
    isRemoved = false;
    for(BookEntry<String,ArrayList<BookItem>> entry2 : sellerMap){
        if(entry2.getKey().equals(book.getSeller())){
            if(entry2.getValue().contains(book)) {
                entry2.getValue().remove(book);
                System.out.println("entry.getValue,getremove");
                System.out.println("book Removed (via titleMap)with title name: " + book.getSeller());
                if(entry2.getValue().isEmpty()) {
                    isRemoved = true;
                    System.out.println("book removed (titlemap)");
                    sellerMap.remove(entry2);
                }
            }
        }
    }

    isRemoved = false;
    for(BookEntry<Integer,ArrayList<BookItem>> entry3 : priceMap){
        if(entry3.getKey().equals(book.getSeller())){
            if(entry3.getValue().contains(book)) {
                entry3.getValue().remove(book);
                System.out.println("entry.getValue,getremove");
                System.out.println("book Removed (via titleMap)with title name: " + book.getSeller());
                if(entry3.getValue().isEmpty()) {
                    isRemoved = true;
                    System.out.println("book removed (titlemap)");
                    sellerMap.remove(entry3);
                }
            }
        }
    }
}

2 个答案:

答案 0 :(得分:2)

我回答了你的另一个问题,但我没有意识到你希望每个循环都能运行。而不是使用return而只使用break。如果你的循环中有多个项可能匹配,那么根本不会破坏,只需让循环自然完成。我仍然建议你返回被删除的对象,以此来判断方法是否有效。抛出异常实际上并不是正确的方法。

我认为您的问题还在于您正在迭代iterator并从支持集合中删除内容。而不是:

titleMap.remove(t);

您应该使用:

it.remove(t);

从集合白色迭代中删除项目是不可能的。

我要做的另一件事是更改你的迭代器循环。使用while循环更具可读性。例如:

Iterator<BookEntry<String, ArrayList<BookItem>>> it = titleMap.iterator()
while (it.hasNext())
{
  /*if book doesn't exist*/
  it.remove();
}

答案 1 :(得分:0)

你的循环return ;

中有这一行

执行此行时,整个方法结束,不再继续。