2015-03-23 3 views
4

Я должен создать библиотечную систему в bluej, и он должен иметь возможность искать книгу. Однако у меня есть проблема. Когда я пытаюсь найти книгу, результат всегда не доступен для книг ... Как мне сортировать, чтобы результат показывал, что книга доступна?ArrayList Поиск книг

private List<Book> collection; 

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

public void addBook(Book book) 
{ 
    collection.add(book); 
} 

public String titleSearch() 
{ 
    String titleSearch = "\n "; 
    for(int i = 0; i < collection.size(); i++){ 
     if(titleSearch.equalsIgnoreCase(collection.get(i).getTitle())){ 

      titleSearch = ("\n Book Avaliable"); 

     }else{ 
      titleSearch = ("\n No Books Avaliable "); 
     } 
    } 
    return titleSearch; 
} 
не
+2

Два комментария к стилю кодирования: с использованием того же слова, что и имя метода, и локальная переменная ... - довольно плохой стиль. Кроме того: используя цикл «foreach», например «для книги (книга книги: коллекция) {« лучше читать/поддерживать, чем «старый стиль» для цикла. – GhostCat

ответ

1

, если вы используете Java 8 вы можете использовать поток

public String searchTitle(String titleSearch) { 

    if(collection.stream().anyMatch(book->{return titleSearch.equalsIgnoreCase(book.getTitle());})){ 
     return "\n Book Avaliable"; 
    } 
    else{ 
     return "\n No Books Avaliable"; 
    } 
} 

вы также можете использовать parallelStream() вместо stream()

5

Во-первых, в ваш код - только последние книги вопросы, вы должны разорвать, если вы нашли подходящую книгу, так как нет необходимости проверять напоминания (и сбросить значение «ни одна книга нашла ") после того, как книга найдена.

for(int i = 0; i < collection.size(); i++){ 
    if(titleSearch.equalsIgnoreCase(collection.get(i).getTitle())){ 
     titleSearch = ("\n Book Avaliable"); 
     break; //<- added a break here, no need to go on iterating and reset titleSearch later on 

    }else{ 
     titleSearch = ("\n No Books Avaliable "); 
    } 
} 

Вышеприведенные кадры терпит неудачу, если ваша коллекция пуста, и вы ищете книги (то есть, очевидно, не существует).
Вы можете решить и улучшить решение, избегая else:

titleSearch = ("\n No Books Avaliable "); 
for(int i = 0; i < collection.size(); i++){ 
    if(titleSearch.equalsIgnoreCase(collection.get(i).getTitle())){ 
     titleSearch = ("\n Book Avaliable"); 
     break; //<- added a break here 
    } 
} 

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

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

public String searchTitle(String titleSearch) { 
    if (titleSearch == null) return "\n No Books Avaliable "; 
    for(int i = 0; i < collection.size(); i++){ 
     if(titleSearch.equalsIgnoreCase(collection.get(i).getTitle())){ 
      return "\n Book Avaliable"; 
     } 
    } 
    return "\n No Books Avaliable "; //reachable only if no book found 
} 

И некоторые последний штрих, чтобы использовать расширенный for each loop :

public String searchTitle(String titleSearch) { 
    if (titleSearch == null) return "\n No Books Avaliable ";   
    for(Book b : collection){ 
     if(titleSearch.equalsIgnoreCase(book.getTitle())){ 
      return "\n Book Avaliable"; 
     } 
    } 
    return "\n No Books Avaliable "; //reachable only if no book found 
} 
+1

Очень интересно, что вы не упоминаете, что он использует неправильную переменную, чтобы проверить соответствие названия. Он использует 'titleSearch', который сохраняет статус своего поиска. Этот поиск будет успешным только в том случае, если есть книга, содержащая '' \ n "' (или более поздний текущий/обновленный статус его поиска). У ваших новых подходов нет этой ошибки. – Tom

+0

@Tom Спасибо, позвольте мне также отредактировать его, по какой-то причине я был уверен, что это был аргумент (который отсутствует в методе в первую очередь). Кроме того, он только равен «\ n» в первой титреции - после него это значение присваивается в инструкции 'else' – amit

+0

Спасибо, ребята, очень помогли! –

-1

@amit Я использовал ваш код. Когда я использовал

if(titleSearch.equalsIgnoreCase(Book.getTitle())) 

код. Я получаю сообщение об ошибке «Нестатический метод getTitle()» не может ссылаться на статический контекст ».

Это моя книга Код:

class Book { 
// instance variable 
private String title; 
private String author; 
private String genre; 
private String ISBN; 
private boolean isCheckOut; 


private static int counter; 

Book(String _title) { 
    this.title = _title; 
    counter++; 
} 

/* Get Methods */ 

public static int getNumOfInstances() { 
    return counter; 
} 

    String getTitle() { 
    return this.title; 
} 

String getAuthor() { 
    return this.author; 
} 

String getGenre() { 
    return this.genre; 
} 

String getISBN() { 
    return this.ISBN; 
} 

/* All Methods for setting Book */ 

void setAuthor(String _author) { 
    this.author = _author; 
} 

void setGenre(String _genre) { 
    this.genre = _genre; 
} 

void setISBN(String _isbn) { 
    this.ISBN = _isbn; 
} 



} 

Вот мой Shelf Код:

import java.util.ArrayList; 
import java.util.List; 

public class Shelf { 

// instance variable 
private String name; 
private String genre; 

private static int counter; 
public ArrayList<Book> books = new ArrayList<Book>(); 

Shelf(String _name) { 
    this.name = _name; 
    counter++; 
} 

static int getNumOfInstances() { 
    return counter; 
} 

String getName() { 
    return this.name; 
} 

String getGenre() { 
    return this.genre; 
} 

Book getBook(int index) { 
    return books.get(index); 
} 

int getBookSize() { 
    return books.size(); 
} 

List<Book> getBooks() { 
    return this.books; 
} 

void setName(String _name) { 
    this.name = _name; 
} 

void setGenre(String _genre) { 
    this.genre = _genre; 
} 

void addBook(Book _book) { 
    books.add(_book); 
} 


public String searchTitle(String titleSearch) { 
    if (titleSearch == null) return "\n No Books Avaliable "; 
    for(Book b : books){ 
     if(titleSearch.equalsIgnoreCase(Book.getTitle())){ 
      return "\n Book Avaliable"; 
     } 
    } 
    return "\n No Books Avaliable "; 
} 


} 

Кстати, булево не используется в данный момент.