Работа с объектом, содержащимся в ArrayList

#java #arraylist #iteration

#java #ArrayList #Итерация

Вопрос:

У меня есть класс с именем Book:

 public class Book {

private String title;
private boolean borrowed;

public Book(String bookTitle) {

    // Store name of book and mark as not borrowed
    title = bookTitle;
    borrowed = false;
}

public void borrowed(){
    // Set borrowed to true
    borrowed = true;
}

public void returned() {
    // Set borrowed to false
    borrowed = false;
}

public boolean isBorrowed() {
    // Return borrowed
    return borrowed;
}

public String getTitle() {
    // return title;
    return title;
}
  

}

И класс, называемый Library:

 public class Library {                

private String address;
private ArrayList<Book> books = new ArrayList<Book>();

public Library(String Address) {

    address = Address;
}

private void addBook(Book book) {

    books.add(book);
}

private void borrowBook(String title) {

    boolean bookFound = false;                        
    // Find Book      
}
  

Мне нужно выполнить метод borrowBook, который будет выполнять поиск по списку массивов, чтобы определить, есть ли книга в библиотеке или нет, а затем использовать метод borrowed() класса book, чтобы пометить книгу как арендованную.

Пока у меня есть что-то вроде этого, хотя я пытаюсь понять, как вызвать заимствованный метод или метод getTitle, чтобы иметь возможность работать с конкретным объектом book, содержащимся в списке массива

 for (int i = 0; i < books.size(); i  ) {

    if (books[i].getTitle() = title) {

         books[i].borrowed();
    }
}
  

Комментарии:

1. Используйте закрытый список<Book> books = новый ArrayList<Book>();

Ответ №1:

Прежде всего, ваш if оператор проверки неверен, т. Е. if (books[i].getTitle() = title) должен быть заменен на,
if(books.get(i).getTitle().equals(title))

и не забудьте проверить borrowed флаг перед вызовом borrowed() функции.

Итак, ваш окончательный код должен выглядеть так,

     for (int i = 0; i < books.size(); i  )
    {
        if (books.get(i).getTitle().equals(title)) 
        {
            if(!books.get(i).isBorrowed())
                books.get(i).borrowed();
            else
            {
                //Inform user book already borrowed
            }
            break;
        }
    }
  

Комментарии:

1. Спасибо!! Работает отлично 🙂

Ответ №2:

Ваша логическая проверка должна быть
books[i].getTitle().equals(title)
или, скажем
title.equals(books[i].getTitle()) .

Вы неправильно сравниваете две строки.
Также рассмотрим случай, когда один или оба из них являются null .

Ответ №3:

 for (int i = 0; i < books.size(); i  ) {

    if (books.get(i).getTitle().equals(title)) {

         books.get(i).borrowed();
    }
 }
  

Проблема с проверкой if (присвоением)

 if (books[i].getTitle() = title)
  

должно быть заменено на (сравнение)

  if (books.get(i).getTitle().equals(title))
  

Чтобы сделать его лучше

 private void borrowBook(String title) {

 boolean bookFound = false;                        
 // Find Book  
 for(Book book : books)
 {
    if (book.getTitle().equals(title)) 
    {
       bookFound = true;  
       book.borrowed();
       break;
    }
 }
 //...More stuffs you may want to do
}
  

Ответ №4:

То, что у вас до сих пор не работает, элементы ArrayList не могут быть доступны с помощью обератора индекса [] . Вам нужно использовать список #get(индекс) списка. также для сравнения строк вы используете оператор equal , это неверно, он сравнивает только ссылки, которые в большинстве случаев не равны для разных экземпляров String (если они не интернированы). Вам нужно использовать метод String#equals(otherString) или string#equalsIgnoreCase(otherString) .

 for (int i = 0; i < books.size(); i  ) {

    if (books.get(i).getTitle().equals(title)) {

         books.get(i).borrowed();
    }
}
  

Вы также можете использовать расширенный цикл for

 for (Book book : books) {
    if (book.getTitle().equals(title)) {
         book.borrowed();
    }
}