当前位置: 首页 > 知识库问答 >
问题:

如何从名单中删除18岁以下的人?

黄靖
2023-03-14

我试图从我的名单中删除所有18岁以下的人,因此我有一个班上的人,这是我在我的主要工作中尝试的:

import java.util.*;

public class Main {

    public static void main(String[] args) {
       
        Person person1 = new Person("Victor", 28, "meerdonk");
        Person person2 = new Person("Alex", 17, "antwerpen");
        Person person3 = new Person("Vlad", 15, "mechelen");

        List<Person> listOfPersons = List.of(person1, person2, person3);
   
        List<Person> adults = getLessThen18(listOfPersons); **//line 22**
        System.out.println(adults);
}   
 public static List<Person> getLessThen18(List<Person> personList) {

       for (Iterator<Person> iterator = personList.listIterator(); iterator.hasNext();){
           if (iterator.next().getAge() < 18 ) {
                iterator.remove(); **//line 40**
           }
       }
        return personList;
    }
}

所以我试着在名单上重复,然后如果这个人在18岁以下,就把它删除。在运行代码时,我得到以下输出:

Exception in thread "main" java.lang.UnsupportedOperationException
    at java.base/java.util.ImmutableCollections.uoe(ImmutableCollections.java:142)
    at java.base/java.util.ImmutableCollections$ListItr.remove(ImmutableCollections.java:380)
    at victor.Main.getLessThen18Iteration(Main.java:40)
    at victor.Main.main(Main.java:22)

有人能告诉我我做错了什么吗?

共有2个答案

雍俊远
2023-03-14

这里的问题是列表。属于。它返回一个不可修改的列表:不能添加、删除或替换元素。

因此,当您尝试调用诸如iterator.remove();这样的函数时,您会得到一个异常。

有以下几种解决方案:

>

  • 通过使用复制构造函数将不可变列表的元素复制到可变列表,创建可变列表:

    列表

    过滤现有列表并创建一个新列表(保留原始列表):

    返回个人列表。流()。过滤器(人)-

    -立即使用 数组创建可变列表。asList(返回一个 ArrayList 列表listOfPersons=Arrays。asList(人员1、人员2、人员3)`

    编辑:数组。asList创建了一个ArrayList,但它是一个不同于任何人想象的类(在数组中的私有静态类)。。

  • 常源
    2023-03-14

    您的代码(List.of)创建了一个不可变的人员列表:

        List<Person> listOfPersons = List.of(person1, person2, person3);
    

    因此,调用remove/add将导致一个异常——就像您的情况一样。

    此外,您的方法名称也会产生误导,因为您正在更改/变异传递的列表参数,而不是返回新列表(如返回值所示)。

    一种可能的方法是:

     public static List<Person> getLessThen18(List<Person> personList) {
        return personList.stream()
                         .filter(person -> person.getAge() < 18)
                         .collect(Collectors.toList());   
     }
    
     类似资料:
    • 问题内容: 我想开发一个模块控制系统,以便每个Spring bean都可以由我自己的LifeCycle Controller进行管理。 但是我不知道如何从ApplicationContext中删除单例spring bean。 那可能是一个有趣的问题,您能帮我解决吗? 问题答案: 你可以尝试删除Bean定义。取得并致电 这取决于创建应用程序的方式,但是例如在Web应用程序中,可以通过以下方式获取定义

    • 问题内容: 在页面中,我放置了一些不需要的行,因此,如何使用HTML删除这些链接? 问题答案: 内联版本: 但是请记住,通常应该将网站的内容HTML分开。因此,通常应避免使用内联样式。 请参阅John的答案,以了解使用CSS的等效答案。

    • 我要删除下划线。 这是我的代码:

    • 问题内容: 我将列表添加到sessionStorage像: 及其工作正常,现在我想通过productId从此列表中删除单个对象。 问题答案: 请参阅以下文章:http : //www.nczonline.net/blog/2009/07/21/introduction-to- sessionstorage/ 如果要从会话存储中删除指定键/值对,则需要如下所示: 对于您的情况: 此外,适当的实现允许

    • 问题内容: 起初,我使用了网格。创建新版本的GWT后,我想替换CellTable上的Grid。 问题答案: 查看javadoc以获取详细信息。我的示例就像您可以在此处找到的示例(稍稍扩展一下):

    • 问题内容: 列出以下MySql命令之间的区别。 删除表 tablename ; 截断表 tablename ; 从 表名 中删除1; 另外,请根据您的经验告诉我每种产品的典型使用场景。 问题答案: 在此之后,它 消失了 。没有桌子了。没有更多数据。 当您不再需要该表时,请使用它。 此后,该表为空,并且(重要地)自动递增键被重置为1。从字面上看,这就像拥有一个全新的表。 当您只需要一个空表时,请使用