在Java中从列表中删除项

在Java中从列表中删除项,java,arraylist,Java,Arraylist,在我的计算机科学课上,我们使用了一个叫做CodeHS的在线程序,它为我们提供涵盖特定主题的作业。通常情况下,我对ArrayList的理解比较好,但这个作业使用的是列表,这有点让我大吃一惊。我一直在苦苦挣扎,我的代码(我将在底部链接它)正在返回它们插入方法参数中的确切列表。(换句话说,我的代码没有做我想做的事情。它根本没有做任何事情。)我对这一点非常陌生,希望能得到一些帮助,给予有益的批评,而不是责骂,哈哈。多谢各位 以下是作业: 你已经得到了一个夏天要读的书的清单,但是你需要删减这张清单,这样你

在我的计算机科学课上,我们使用了一个叫做CodeHS的在线程序,它为我们提供涵盖特定主题的作业。通常情况下,我对ArrayList的理解比较好,但这个作业使用的是列表,这有点让我大吃一惊。我一直在苦苦挣扎,我的代码(我将在底部链接它)正在返回它们插入方法参数中的确切列表。(换句话说,我的代码没有做我想做的事情。它根本没有做任何事情。)我对这一点非常陌生,希望能得到一些帮助,给予有益的批评,而不是责骂,哈哈。多谢各位

以下是作业:

你已经得到了一个夏天要读的书的清单,但是你需要删减这张清单,这样你就可以把所有的书都读完

写一个方法

public List<Book> filterBooks(List<Book> readingList, int maxPages)
这就是我尝试过的:

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;

}
public List filterBooks(List readingList,int-maxPages)
{
图书流通图书;
ArrayList readingList2=新的ArrayList();
对于(int i=0;i=maxPages)
{
读取列表。删除(currentBook);
}
}
返回阅读列表;
}

您创建了一个新列表
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;
}
public List filterBooks(List readingList,int-maxPages){
List newReadingList=newarraylist();
对于(最终书籍当前书籍:阅读列表){
如果(currentBook.getNumPages()
您能使用Java8吗?那就用lambdas吧

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

return readingList.stream().filter(book->book.getNumPages()您可以使用
List.removeIf(…)
函数(如果列表支持该函数),该函数完全可以执行您想要的操作:如果列表中的所有对象符合条件,则将其删除

所以代码应该是(使用lambda):


readingList.removeIf(b->b.getNumPages()您的代码似乎与您描述的不一样。您应该从原始列表中删除一些项目,因此它不应该返回完全相同的列表,除非您选中的书籍都不符合删除条件。(假设传入的列表是可变的。)


但是,您也有一些错误。根据问题描述,您的情况应该是>而不是>=。您还有一个错误,即当您按索引处理元素时,您没有补偿从原始列表中删除的错误。如果您删除索引i中的项目,则不应增加i,因为下一本书现在将位于该位置而且你不想跳过它。如果一行中有两本书应该删除,你会跳过一些本该删除的书。

“但是这个作业使用列表,这有点让我大吃一惊”-一个
ArrayList
是一个
列表的实现
您创建了一个
readingList2
,但没有使用它。我建议您从现有列表中构建一个新列表,如果它满足您所需的条件,则将每个项目添加到新列表中,而不是从原始列表中删除它们。然后,返回新列表。删除I来自
readingList
的TEM,更改调用方传递的列表,相反,正如Robert所建议的,使用一个新的
ArrayList
并将您想要保存的书籍放在其中并返回,而不是作为一个备用项,您通常应该避免从您正在迭代的列表中删除项目。原因太复杂,无法解释他当然,这样一个操作真正起作用的唯一方法是向后迭代集合。谢谢大家!我接受了你们的建议,并使用了我创建的新列表来添加项,而不是带走项。我还意识到我无意中提供了一个仍在进行中的代码,而不是我的最终产品,哦!而不是再次向大家致意。[叹气](S)他确实透露了这是一项家庭作业。目的是提供提示,而不是给学生答案。@RobertHarvey她已经猜出了大部分。对不起,我无法抗拒。别担心,我不会用别人的作业,谢谢你。我已经解决了。
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;
}
readingList.removeIf(b -> b.getNumPages() <= maxPages);
readingList.removeIf(new Predicate<Book>() {
    @Override
    public boolean test(Book b) {
        return b.getNumPages() <= maxPages;
    }
}