用另一个数组的选定元素创建新数组

4
前言:我对Java很不熟悉,正在学习。我搜索了很多,但找不到答案。我们不能使用ArrayList。
我有一个Book类,它包含特定书籍的信息,如页数、作者等。
我有一个Bookshelf类,它读取一个Book对象数组。我需要编写一个方法,该方法接受作者姓名,查找所有由该作者撰写的书籍,然后返回这些书籍的数组。
我的计划是查找该作者撰写的所有书籍的总数,并将其存储在一个变量中。然后创建一个具有该大小的新数组。我只是不知道如何从Book数组中选择元素并将它们放入新数组中。
目前为止我所拥有的内容,不确定是否正确...
public Book[] getBooksByAuthor(String author) {
    int count = 0;
    String a  = author;

    for(int i = 0; i < books.length; i++){
        if(books[i].getAuthor().equals(a)){
            count += 1;
        }
    }

目前看起来不错,现在您需要创建一个新数组并再次迭代以将元素添加到新数组中。 - UnholySheep
2
到目前为止,这是正确的。您知道如何使用“count”变量创建数组吗? - Paul Boddington
Book[] newBooks = new Book[count]; 将创建一个大小为 count 的新数组。 但是,如果我再次循环并将值分配给新数组,可能会创建一些空索引,因为没有匹配项,如果这有意义的话。 - Lambtron
请不要在您找到更好的方法后编辑您的问题,因为那会改变问题本身。如果您自己找到了解决方案,请发布一个答案。 - Bohemian
3个回答

4
Java 8的流提供了一种非常优雅的方法来做到这一点:
public Book[] getBooksByAuthor(String author) {
    return Arrays.stream(books)
                 .filter(b -> b.getAuthor().equals(author))
                 .toArray(Book[]::new);
}

我会说只说“Java”,而不是“Java 8”,因为现在Java 8已经相当老了,可以假定每个人都在使用这个版本。 - Bohemian
@Bohemian 不是真的。例如我的学校(在瑞士这里是一所很好的工程师学校)仍在使用Java 7... - Paul Lemarchand
@Paul,如果你的学校仍在使用6年前发布并已于2.5年前被取代的Java版本,则这不是一所好学校。很少有雇主会使用版本7,因此你所谓的“好”学校正在教授几乎没有用武之地的技能。 - Bohemian
@Bohemian,Java只是我们计算机科学专业第二年的一门课程(学校很大,有很多不同的方向),所以我认为他们并不太在意,因为我们主要学习C语言。但我认为你是对的,我会问问学校是否可以改变这种情况。感谢你开拓我的思路。 - Paul Lemarchand

1
我的最终结果:
public Book[] getBooksByAuthor(String author) {
    int count = 0;
    String a  = author;
    int iter = 0;

    for(int i = 0; i < books.length; i++){
        if(books[i].getAuthor().equals(a)){
            count += 1;
        }
    }
    Book[] newBooks = new Book[count];
    for (int i = 0; i < books.length; i++){
        if(books[i].getAuthor().equals(a)){
            newBooks[iter] = books[i];
            iter += 1;

        }
    }
    return newBooks;
}

0
如果您无法使用数组,可以这样做:
String booksFromAuthor = "";
for(final String book : books){
    if(book.equals(author))
        booksFromAuthor += book + "|";
}
return booksFromAuthor.split("|");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接