2014-11-21 2 views
0

Я создаю класс библиотеки, который хранит объекты класса Book в сочетании ArrayList. У меня большая часть функциональности, но мне бы хотелось, чтобы функция удаления удаляла все объекты параметра (имени) при вызове. Функция, которую я сделал до сих пор, только удаляет первый элемент, с которым он сталкивается, а затем прекращает выполнение.Java: удалить все объекты с помощью итератора

Моя библиотека классов выглядит следующим образом (код для добавления объектов опущена):

import java.util.ArrayList; 
import java.util.Iterator; 

public class Library { 
    private ArrayList<Book> collection; 
    private Book book; 

public Library() { 
    collection = new ArrayList<Book>(); 

} 

public Book findBook(String searchBook) { 

    Book bookB = null; 
    Iterator<Book> it = collection.iterator(); 
    boolean found = false; 

    while (it.hasNext() && !found) { 
     bookB = it.next(); 
     String b = book.getBookName(); 

     if (b.equals(searchBook)) { 
      found = true; 

     } 
    } 

    if (found) { 
     return bookB; 
    } 
    else { 
     return null; 
    } 
} 

public void removeBook (String searchBook) { 

    if (findBook(searchBook) != null && bookname.equals(searchBook)) { 
     Book b = findBook(searchBook); 
     System.out.println("Removed " + b.getBookName()); 
     collection.remove(b); 
    } 
    else { 
     System.out.println("Don't worry, we don't have that one anyways"); 
    } 
} 

}

Мой друг сказал мне, чтобы сделать петлю Еогеасп, чтобы обернуть если/другое внутри removeBook, но до сих пор я этого не делал, потому что, честно говоря, я не знаю, как его реализовать.

Любая помощь, проницательность или отзывы абсолютно приветствуются.

+0

вы ищете [итератора # удалить()] (https://docs.oracle.com/javase/7/docs/api/java/ util/Iterator.html # remove())? –

+0

Да, мне нужно Iterate над всеми объектами в коллекции, а затем удалить каждый объект с тем же именем (String) – Sifu

ответ

1

Вам нужно будет перебрать все элементы списка, а затем проверить название книги, что равно, что вы прошли в качестве параметра метода removeBook и если вы найдете такие затем удалите его с помощью метода удаления итератора. Так код должен быть что-то вроде:

Iterator<Book> it = collection.iterator(); 
Book book; 
while (it.hasNext()) { 
    book = it.next(); 
    if (book.getBookName().equals(searchBook)) { 
     it.remove(); 
    } 
} 
+0

Это решение отлично работает. Благодаря! – Sifu

+0

Добро пожаловать и рад, что это сработало для вас. Если вы считаете, что этот ответ помог, пожалуйста, примите его и закройте этот вопрос/ – SMA

0

Вы, вероятно, хотите что-то вроде

Book b = findBook(searchBook); 
while(b != null) { 
    collection.remove(b); 
    b = findBook(searchBook); 
    ... 
} 
+0

Я пробовал функцию и компилируется, но когда я пытаюсь выполнить ее, возвращается java.langNullPointerException: null в String b = book.getBookName(); – Sifu

+0

Возможно, вы, вероятно, вставляете нулевые объекты в список. Поскольку вы всегда проверяете it.hasNext() перед тем, как делать book = it.next(), книга всегда будет элементом списка. Вы можете проверить, является ли оно нулевым до извлечения его имени, но это нехорошо, было бы лучше, если бы вы выяснили, где в вашем коде null Книги вставляются в список. –

0

while (it.hasNext() && !found) в методе findBook(searchBook) останавливается, как только он нашел книгу с именем переданного в качестве аргумента. И возвращает это book. Вот почему удаляется только один объект с этим name. Измените свой код, чтобы вернуть list всех объектов с этим именем. Просто проверьте тип возврата booksFound, если в нем есть книги, такие как booksFound.Size > 0. И затем перебирайте список и удаляйте их.

public List<Book> findBook(String searchBook) { 

Book bookB = null; 
Iterator<Book> it = collection.iterator(); 
List<Book> booksFound = new ArrayList<Book>(); 

while (it.hasNext()) { 
    bookB = it.next(); 
    String b = book.getBookName(); 

    if (b.equals(searchBook)) { 
     booksFound.add(b); 
    } 
} 
return booksFound; 
} 

И метод удалить:

public void removeBook (String searchBook) { 

List<Books> booksFound = findBook(searchBook); 
if(booksFound.size() > 0) { 
    for (Book book: booksFound) { 
     collection.remove(book); 
    } 
} 
else { 
    System.out.println("Don't worry, we don't have that one anyways"); 
} 
} 
+0

Кажется очень сложным, что я должен сделать это много изменений, чтобы иметь возможность применять такую ​​(относительно) небольшую функциональность. Я полный новичок в java и, конечно же, буду слушать любые советы, приведенные здесь, но разве это не должно быть проще? Примечание: Я пробовал решение верхнего комментария, и он работал очень хорошо. Есть ли какие-либо преимущества в использовании списка, как вы описываете, за просто регулярную итерацию объектов? – Sifu

+0

В программировании всегда есть баланс между простотой и гибкостью кода. Вышеприведенный код может выглядеть длиннее или сложнее, но очень гибкий, если вы должны вносить изменения в будущем. Вы можете использовать метод 'findBook (arg)' для различных задач в вашем приложении.Если вы ограничиваете эту программу одной конкретной задачей, вам нужно будет написать другой метод. Следовательно, вы в конечном итоге будете писать один и тот же метод снова и снова, который является избыточным и сделает код более жестким. Всегда думайте о будущем использовании программы при кодировании. Так что легко расширять код и поддерживать его. – Abhay

Смежные вопросы