【问题标题】:Not able to remove a list of items from a main list in java [duplicate]无法从java中的主列表中删除项目列表[重复]
【发布时间】:2018-04-06 10:41:32
【问题描述】:
public static void main(String[] args) {
    String OptionId = "111, 112, 113, 114, 115";

    List<String> fullList = Arrays.asList(OptionId.split(","));
    List<String> values = new ArrayList<String>();

    System.out.println("fullList: " + fullList.toString());

    List<String> subItems = fullList.subList(0, 3);

    System.out.println("subItems: " + subItems);

    for (String s : fullList) {
        String strs[] = new String[2];

        if (subItems.contains(s) 
               || subItems.contains(strs[0]) 
               || subItems.contains(strs[1])) {
            values.add(s);                      // save the value to a list
        }
    }
    System.out.println("values: " + values);

    fullList.remove(values);

    System.out.println("fullList: " + fullList);

}

据我所知,最终的完整列表应该只有 [114, 115]。但它没有删除子列表中存在的项目。

我也试过下面的代码。 fullList.removeAll(values);

但它会引发以下错误。

Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.remove(AbstractList.java:161)
at java.util.AbstractList$Itr.remove(AbstractList.java:374)
at java.util.AbstractCollection.removeAll(AbstractCollection.java:376)
at com.tesco.rangeplan.client.Test.main(Test.java:32)

我需要如下输出:

fullList: [114,  115]

【问题讨论】:

    标签: java list exception arraylist


    【解决方案1】:

    您的具体错误UnsupportedOperationException 是因为您使用的是Arrays.asList,它返回一个固定大小的列表。您不能从中添加/删除。这就是它抛出异常的原因。

    创建ArrayList 并将项目添加到其中。顺便说一句

    String strs[] = new String[2]; 并且您的后续等于检查将始终导致错误,因为其中没有任何内容。此外,如果您按, 拆分,您还应该使用trim() 它,否则您当前的示例中有空格。

    【讨论】:

    • 既然set被实现了,它并不是真正的不可变的。
    • @lexicore true.
    【解决方案2】:

    Arrays.asList() 返回由指定数组支持的固定大小列表。
    因此,固定大小的您无法添加或删除元素。
    将其包装成ArrayList 以防止这种限制:

    List<String> fullList = new ArrayList<>(Arrays.asList(OptionId.split(",")));
    

    您也可以这样做:

    List<String> fullList = Arrays.stream(OptionId.split(",")).collect(Collectors.toList());
    

    请注意,您使用List&lt;String&gt; 作为参数调用remove(Object)。 它不会删除任何内容,因为此方法允许删除传递给的元素,实际上StringList 中不包含List。而不是使用接受集合作为参数的removeAll(Collection&lt;?&gt;)

    【讨论】:

    • 我已经按照上面的建议进行了修改。但我的最终输出仍然是:fullList: [111, 112, 113, 114, 115]
    • 您调用 remove() 时使用字符串列表而不是字符串作为参数。而是使用 removeAll()。我更新了。
    猜你喜欢
    • 2018-12-04
    • 2020-04-22
    • 1970-01-01
    • 2013-05-28
    • 2017-11-14
    • 2011-01-13
    相关资源
    最近更新 更多