从Java列表中删除项目

时间:2018-12-17 21:53:05

标签: java arraylist

在我的计算机科学课程中,我们使用一个名为CodeHS的在线程序,该程序为我们提供了涉及某些主题的作业。通常,我对ArrayLists的理解比较好,但是此分配使用Lists代替,这有点让我失望。我一直在挣扎一点,我的代码(我将在底部将其链接)返回的是它们在方法参数中插入的确切列表。 (换句话说,我的代码没有按照我想要的去做。它根本没有做任何事情。)我对此很陌生,希望能得到一些帮助,但有帮助的批评而不是责骂哈哈。谢谢。

这是作业:

系统会向您提供夏季要阅读的书籍清单,但是您需要精简书籍清单,以便完成所有书籍。

写一个方法

public List<Book> filterBooks(List<Book> readingList, int maxPages)

将“书籍列表”作为参数,从readList中删除所有包含maxPages页以上的书籍,然后返回结果列表。

您可以通过调用book.getNumPages()来访问Book的页数。提供Book类以供参考。

public class Book
{
private String title;
private String author;
private int numPages;

public Book(String theTitle, String theAuthor, int numberOfPages)
{
    title = theTitle;
    author = theAuthor;
    numPages = numberOfPages;
}

public String getTitle()
{
    return title;
}

public String getAuthor()
{
    return author;
}

public int getNumPages()
{
    return numPages;
}

public String toString()
{
    return title + " by " + author;
}

public boolean equals(Book other)
{
    return title.equals(other.title) && author.equals(other.author);
}
}

这是我尝试过的:

public List<Book> filterBooks(List<Book> readingList, int maxPages)
{
Book currentBook;
ArrayList<String> readingList2 = new ArrayList<String>();
for(int i= 0; i < readingList.size(); i++)
{
    currentBook = readingList.get(i);
    if(currentBook.getNumPages() >= maxPages)
    {
       readingList.remove(currentBook);
    }
}

    return readingList;

}

4 个答案:

答案 0 :(得分:1)

您可以使用List.removeIf(...)函数(如果列表支持)(完全符合您的要求):如果满足条件,则删除该列表中的所有对象。

因此,代码将是(带有lambda):

readingList.removeIf(b -> b.getNumPages() <= maxPages);

或者没有lambda:

readingList.removeIf(new Predicate<Book>() {
    @Override
    public boolean test(Book b) {
        return b.getNumPages() <= maxPages;
    }
}

答案 1 :(得分:1)

您的代码似乎不是您所描述的。您应该从原始列表中删除一些项目,因此它不应返回完全相同的列表,除非您检查的所有书都不符合删除标准。 (假设传入的列表是可变的。)

但是您也有一些错误。根据问题描述,您的情况应为> not> =。当您按索引寻址元素时,您还无法补偿不从原始列表中删除的方式中也存在一个错误。如果您删除索引i处的项目,则不应递增i,因为下一本书现在将处于该位置,并且您不想跳过它。如果连续要删除两本书,则会跳过一些本应删除的书。

答案 2 :(得分:0)

可以使用Java8吗?然后使用lambda。

public List<Book> filterBooks(List<Book> readingList, int maxPages) {
    return readingList.stream().filter(book -> book.getNumPages() <= maxPages).collect(Collectors.toList());
}

如果没有,则-在迭代列表时切勿修改列表。而是创建一个新的。

public List<Book> filterBooks(List<Book> readingList, int maxPages) {
    List<Book> result = new ArrayList<>();
    for (Book book : readingList){
        if (book.getNumPages() <= maxPages){
            result.add(book);
        }
    }
    return result;
}

始终尝试在声明中使用抽象(例如List)而不是实际的实现(例如ArrayList)。它将使您将来可以更改实施方式,并且更加灵活。

请参考Liskov原则-SOLID原则之一。

答案 3 :(得分:-1)

您创建了一个新列表readingList2,但是您没有在任何地方使用它。您正在尝试更改作为正式参数接受的列表。

为什么不以不同的方式处理问题并仅返回需要的值返回新列表?

代码段:

public List<Book> filterBooks(List<Book> readingList, int maxPages) {
    List<Book> newReadingList = new ArrayList<>();
    for(final Book currentBook : readingList) {
        if(currentBook.getNumPages() < maxPages) {
           newReadingList.add(currentBook);
        }
    }
    return newReadingList;
}