2015-02-23 3 views
1

Обычно у меня нет проблем при сканировании списка массивов для определенных элементов. Я отдаю себе отчет в том, как структурировать петлю и т.д. Хотя Однако, в данном случае, мне нужно использовать сканер, но он дает свои проблемы, как показано здесь:Проблема со сканером и циклом While для проверки arraylist

enter image description here

Следующий код предназначен для используйте сканер для ввода автора и названия, чтобы проверить, находится ли эта точная книга (состоящая из точного соответствия как имени автора, так и названия) в списке массивов.

Скорее всего я с видом что-то простое, но в любом случае, мне не нужен какие-либо комментарии, комментируя этот являющийся немой код и т.д.

public String checkForBookUsingInfo(){ 
    int index = 0; 
    Book bookObject = null; 
    String returnValue = "Book not found"; 
    String title = ""; 
    String author = ""; 
    Boolean isFound = false; 
    while (index <bookList.size() && isFound == false){ 
     bookObject = bookList.get(index); 
     System.out.println("Please enter title of book to search for."); 
     String anyTitle = keybd.next(); 
     System.out.println("Please enter author of book to search for."); 
     String anyAuthor = keybd.next(); 
     if ((title.equals(anyTitle)) && (author.equals(anyAuthor))){ 
      returnValue = "Book is in library."; 
     } 
     index++; 
    } 
    return returnValue; 

ответ

0

next() возвращает только один маркер (слово), так для данных вроде The Prince сначала next() вернется "The" второй next() вернет "Prince" (так что он не будет ждать ввода от пользователя, так как он уже имеет свой токен).

Если вы хотите прочитать более одного слова, прочитайте всю строку с nextLine().

В случае, если вы хотите использовать в вашем коде как next() и nextLine() вы должны прочитать Scanner is skipping nextLine() after using next(), nextInt() or other nextFoo() methods

Есть несколько других проблем:

  • вы не устанавливая isFound в true, если книга будет найдено ;
  • вы просите имя книги и автора каждый раз, когда вы перебираете книги, но вы должны знать эту информацию до итераций, поэтому, возможно, пусть пользователь передает эту информацию в качестве аргументов методов.
  • вы сравниваете значения, предоставленные пользователем с пустыми строками ("") от title и author полей

Ваш код должен выглядеть примерно:

class Book{ 
    private String author; 
    private String title; 

    //getters and setters 
} 


class Library { 

    private List<Book> bookList = new ArrayList<Book>(); 

    public String checkForBookUsingInfo(String author, String title){ 
     for (Book book : bookList){ 
      if (book.getAuthor().equals(author) && book.getTitle().equals(title)){ 
       return "Book is in library."; 
      } 
     } 
     return "Book not found in library"; 
    } 

    public static void main(String[] args) throws Exception { 
     Scanner keybd = new Scanner(System.in); 
     Library library = new Library(); 
     //add some books to library 
     //.... 

     System.out.println("Please enter title of book to search for."); 
     String anyTitle = keybd.nextLine(); 

     System.out.println("Please enter author of book to search for."); 
     String anyAuthor = keybd.nextLine(); 

     String stateOfBook = library.checkForBookUsingInfo(anyAuthor, anyTitle); 
     System.out.println(stateOfBook); 

    } 
} 
+0

Хорошо, что хорошая новость заключается в том, что после фиксации этого, он правильно отображает линии, тем самым устраняя путаницу в моем мозгу. Тем не менее, он повторяется, задавая вопросы, соответствующие размеру списка массивов. Когда я это делал без сканера, он только один раз спросил. Кроме того, поля, похоже, не сохраняются, так как даже когда я перечисляю книгу правильно 4 раза, она говорит, что книга не была найдена. – Frog666

+0

И где именно вы устанавливаете 'isFound' на' true', если была найдена книга для остановки итераций? – Pshemo

+0

Ну, теперь я знаю, где я не должен его устанавливать. – Frog666

0

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

public String checkForBookUsingInfo(){ 
    int index = 0; 
    Book bookObject = null; 
    String returnValue = "Book not found"; 
    String title = ""; 
    String author = ""; 
    Boolean isFound = false; 
    System.out.println("Please enter the name of a book to search for."); 
    String anyTitle = keybd.nextLine(); 
    System.out.println("Please enter the name of an author to search for."); 
    String anyAuthor = keybd.nextLine(); 
    while (index <bookList.size() && isFound == false){ 
     bookObject = bookList.get(index); 
     title = bookObject.getTitle(); 
     author = bookObject.getAuthor(); 
     if ((title.equals(anyTitle)) && (author.equals(anyAuthor))){ 
      returnValue = "Book is in library."; 
     } 
     index++; 
    } 
    return returnValue; 
} 
Смежные вопросы