在我的计算机科学课程中,我们使用一个名为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;
}
答案 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;
}