我的删除方法中有这个问题,我不太明白。
执行此方法时,它会遍历第一个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);
}
}
}
}
}
答案 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 ;
执行此行时,整个方法结束,不再继续。