2016-09-18 52 views
-1

以下代码假设为作者和标题采用字符串来检查该确切书籍是否位于数组列表中,如果它是数组,则返回数组中的副本数量。到目前为止,它只是检查,如果这本书是在数组列表,但我想知道如果有如果你想找到的数量,我可以用它来找到一个数组列表查找数组列表中的重复元素

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

而不是'返回“书是在库中”;'添加'numBookCopies ++;'删除'else'块并在最后返回'numBookCopies'。 – NikolayKondratyev

回答

0

重复元素的任何IPA一本书的副本,这将是:

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,你需要写getter方法从田间地头得到的值。

0

您的Book字段缺少类型(我假设您想要String s),并且您没有访问者(或获得者)这些字段。另外,我可能会覆盖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

或者你可以创建一个等号方法在Book上,然后使用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() 
    } 
} 

林的东西肯定不完全是你所需要的(对不起着不太明白的问题),但希望这至少给你一些想法。

注意:我没有编译这个,所以请原谅任何编译错误。

1

随着Book

class Book { 

    private String author; 
    private String title; 

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

} 

此适当执行equals和散列码执行可以使用流

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类中有getter方法。