首页 >Java >java教程 >为什么从'Arrays.asList”中删除元素会导致'UnsupportedOperationException”?

为什么从'Arrays.asList”中删除元素会导致'UnsupportedOperationException”?

Patricia Arquette
Patricia Arquette原创
2024-12-22 12:17:16940浏览

Why Does Removing Elements from `Arrays.asList` Result in an `UnsupportedOperationException`?

从“Arrays.asList”列表中删除时解决“UnsupportedOperationException”

在提供的 Java 代码中,在以下情况下会发生异常“UnsupportedOperationException”:尝试从使用“Arrays.asList”创建的“列表”中删除元素。此问题有多个根本原因:

来自“Arrays.asList”的固定大小列表

“Arrays.asList”返回由提供的数组支持的“列表” 。这个“列表”是固定大小的,这意味着它的结构不能通过添加或删除元素来修改。因此,调用“remove”方法会导致“UnsupportedOperationException”。

“split”方法中的正则表达式问题

带有给定参数的“split”方法“ |”将其视为正则表达式元字符。要按文字“|”进行拆分,必须将其转义为“|”。

随机元素删除的改进算法

避免多次调用“remove”对于随机索引,更有效的方法是在范围内生成足够的随机数,并使用“列表迭代器”。此优化将算法的复杂度降低到 O(N)。

修订代码

要解决问题并实现改进的算法,可以使用以下代码:

import java.util.LinkedList;
import java.util.List;
import java.util.Random;

public static String SelectRandomFromTemplate(String template, int count) {
    String[] split = template.split("\|");
    List<String> list = new LinkedList<String>(Arrays.asList(split));
    Random r = new Random();
    int[] indicesToRemove = new int[list.size() - count];

    for (int i = 0; i < indicesToRemove.length; i++) {
        indicesToRemove[i] = r.nextInt(list.size());
    }

    indicesToRemove = Arrays.sort(indicesToRemove);
    java.util.ListIterator<String> iter = list.listIterator();
    for (int i : indicesToRemove) {
        iter.next();
        iter.remove();
    }

    return StringUtils.join(list, ", ");
}

此修改后的代码解决了上述问题,使用从数组创建的固定大小的“列表”并实现了更高效的算法用于随机删除元素以避免“UnsupportedOperationException”。

以上是为什么从'Arrays.asList”中删除元素会导致'UnsupportedOperationException”?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn