2016-09-18 3 views
-1

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

public class Book{ 
     private title; 
     private author; 
    } 

public class Library { 
     private ArrayList<Book>libraryBooks; 
     public int checkNumCopies(String title,String author){ 
      int numBookCopies = 0; 
      for(Book b:libraryBooks){ 
       if((b.equals(title))&& (b.equals(author))){ 
        return "Book is in the library";  
        } 
       else 
        return "Book is not in the library"; 
       } 
      } 
+0

Вместо «return» Книга находится в библиотеке »;' add 'numBookCopies ++;' удалять 'else' и возвращать' numBookCopies' в конце. – NikolayKondratyev

ответ

0

Если вы хотите, чтобы найти число копии книги, которая будет:

public int checkNumCopies(String title, String author) { 
    int numBookCopies = 0; 
    for (Book b : libraryBooks) { 
     if ((b.title.equals(title)) && (b.author.equals(author))) { 
      numBookCopies++; 
     } 
    } 
    return numBookCopies; 
} 

В противном случае вместо отправки названия и автора индивидуально вы можете отправить объект книги. Это было бы лучшим способом:

public int checkNumCopies(Book book) { 
    int numBookCopies = 0; 
    for (Book b : libraryBooks) { 
     if ((b.title.equals(book.title)) && (b.author.equals(book.author))) { 
      numBookCopies++; 
     } 
    } 
    return numBookCopies; 
} 

Так как вы сделали поля private, вам нужно написать методов получения для получения значений из полей.

0

Ваших Book полей отсутствуют тип (я предполагаю, что вы хотели String с), и у вас нет аксессора (или добытчиков) для этих полей. Кроме того, я бы, вероятно, переопределил equals и использовал это. Нечто подобное,

public class Book { 
    public Book(String title, String author) { 
     this.title = title; 
     this.author = author; 
    } 

    private String title; 
    private String author; 

    public String getTitle() { 
     return title; 
    } 

    public String getAuthor() { 
     return author; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) { 
      return true; 
     } 
     if (obj instanceof Book) { 
      Book b = (Book) obj; 
      return b.title.equals(title) && b.author.equals(author); 
     } 
     return false; 
    } 
} 

И затем использовать его, я хотел бы сделать что-то вроде

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

public int checkNumCopies(String title, String author) { 
    Book toFind = new Book(title, author); 
    int numBookCopies = 0; 
    for (Book b : libraryBooks) { 
     if (b.equals(toFind)) { 
      numBookCopies++; 
     } 
    } 
    return numBookCopies; 
} 

или в Java 8+, как

Book toFind = new Book(title, author); 
return (int) libraryBooks.stream().filter(book -> book.equals(toFind)).count(); 
0

Или вы могли бы создать равенства метод в книге, а затем используйте HashSet. Что-то вроде

public class Book{ 
    private title; 
    private author; 

    //implement hashcode 

    public boolean equals(Object o) { 
     if (!(o instanceof Book)){ return false} 
     Book that = Book.class.cast(o); 
     // you may want to do a null check here 
     return this.title.equals(that.title) && this.author.equals(that.author); 
    } 

} 

public class Library { 
    private ArrayList<Book>libraryBooks; 
    public int checkNumCopies(String title,String author){ 
     return libraryBooks.size() - new HashSet(libraryBooks).size() 
    } 
} 

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

примечание: я havent скомпилировал это, поэтому, пожалуйста, извините любые ошибки компиляции.

1

При правильной реализации равных и реализации HashCode в Book

class Book { 

    private String author; 
    private String title; 

    //Getters and Setters 
    //hashCode and equals impl 
    //toString impl 

} 

это может быть достигнуто с использованием потоков

List<Book> books = Arrays.asList(new Book("book-1", "title-1"), new Book("book-2", "title-2"), new Book("book-3", "title-3"), 
      new Book("book-1", "title-1"), new Book("book-2", "title-2")); 
    Map<Book, Long> bookCount = books.stream().collect(Collectors.groupingBy(b -> b, Collectors.counting())); 
    System.out.println(bookCount); 

выход

{Book [author=book-3, title=title-3]=1, Book [author=book-2, title=title-2]=2, Book [author=book-1, title=title-1]=2} 
0

Здесь решение с помощью Java потоков API

public class Library { 

    private ArrayList<Book> libraryBooks; 

    public long checkNumCopies(String title, String author) { 

     return libraryBooks 
      .stream() 
      .filter(book -> book.getAuthor().equals(author) && book.getTitle().equals(title)) 
      .count(); 

    } 
} 

Я предположил, что в классе Book есть методы получения.

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