[英]Removing items from a list in Java
在我的计算机科学课上,我们使用一个名为CodeHS的在线程序,它为我们提供了涵盖某些主题的作业。 通常,我相对较好地理解ArrayLists,但是这个赋值使用了Lists而且它有点让我沮丧。 我一直在苦苦挣扎,我的代码(我将它们链接在底部)返回它们在方法参数中插入的确切列表。 (换句话说,我的代码没有按照我的意愿行事。它根本没有做任何事情。)我对此很新,并且会感谢一些帮助,有用的批评而不是责骂,哈哈。 谢谢。
这是作业:
您已经获得了夏季阅读的书籍清单,但您需要减少书籍清单,以便完成所有这些书籍。
写一个方法
public List<Book> filterBooks(List<Book> readingList, int maxPages)
这会将Book of Books作为参数,从readingList中删除所有具有多个maxPages页面的Books,然后返回结果列表。
您可以通过调用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;
}
您可以使用List.removeIf(...)
函数(如果列表支持它)完全符合您的要求:如果符合条件,则删除该列表中的所有对象。
所以代码将是(与lambda):
readingList.removeIf(b -> b.getNumPages() <= maxPages);
或者没有lambdas:
readingList.removeIf(new Predicate<Book>() {
@Override
public boolean test(Book b) {
return b.getNumPages() <= maxPages;
}
}
您的代码似乎不是您所描述的。 您应该从原始列表中删除一些项目,因此它不应返回完全相同的列表,除非您检查的书籍都没有与删除标准相匹配。 (假设传入的列表是可变的。)
但是你也有一些错误。 根据问题描述,您的条件应该>>>。 当您按索引处理元素时,您还有一个错误,就是您无法补偿从原始列表中删除的方式。 如果您删除索引i处的项目,则不应增加i,因为下一本书现在将处于该位置,您不想跳过它。 如果连续存在两本应删除的书籍,您将跳过一些应该删除的书籍。
你能用Java8吗? 然后使用lambdas。
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原则之一。
您创建了一个新列表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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.