问答中心分类: JAVA为什么在尝试从列表中删除元素时会出现UnsupportedOperationException?
0
匿名用户 提问 1小时 前

我有以下代码:

public static String SelectRandomFromTemplate(String template,int count) {
   String[] split = template.split("|");
   List list=Arrays.asList(split);
   Random r = new Random();
   while( list.size() > count ) {
      list.remove(r.nextInt(list.size()));
   }
   return StringUtils.join(list, ", ");
}

我明白了:

06-03 15:05:29.614: ERROR/AndroidRuntime(7737): java.lang.UnsupportedOperationException
06-03 15:05:29.614: ERROR/AndroidRuntime(7737):     at java.util.AbstractList.remove(AbstractList.java:645)

这是正确的方法吗?Java语言15

16 Answers
0
Nick Orton 回答 1小时 前

这把我烧了好多次。Arrays.asList创建不可修改的列表。固定大小指定数组支持的列表。
创建具有相同内容的新列表:

newList.addAll(Arrays.asList(newArray));

这会产生一些额外的垃圾,但您可以对其进行变异。

Jack Leow 回复 1小时 前

次要的一点是,您并不是在“包装”原始列表,而是在创建一个全新的列表(这就是它工作的原因)。

cs94njw 回复 1小时 前

是的,我使用了数组。JUnit测试用例中的asList(),然后存储在映射中。更改了我的代码,将传入的列表复制到我自己的ArrayList中。

SMBiggs 回复 1小时 前

你的解决方案在我的情况下不起作用,但谢谢你的解释。你提供的知识导致了我的解决方案。

Donald Duck 回复 1小时 前

它也可以new ArrayList<>(Arrays.asList(...)).

0
Roman 回答 1小时 前

可能是因为你和不可修改的包装.
更改此行:

List list = Arrays.asList(split);

至此行:

List list = new LinkedList<>(Arrays.asList(split));
Dimitris Andreou 回复 1小时 前

阵列。asList()不是不可修改的包装。

Roman 回复 1小时 前

@Polygene润滑油:看来你弄错了unmodifiableimmutable.unmodifiable确切地说是“可修改,但在结构上不可修改”。

polygenelubricants 回复 1小时 前

我只是试着创建一个unmodifiableList包装并尝试set; 它抛出UnsupportedOperationException. 我很肯定Collections.unmodifiable*真正意味着完全不变性,而不仅仅是结构性的。

Nathan Ripert 回复 1小时 前

7年后读到这些评论,我允许自己指出以下链接:堆栈溢出。com/questions/8892350/…可能修复不可修改和不可修改之间的差异,这里讨论。

Paŭlo Ebermann 回复 1小时 前

是的,阵列。asList不是一个不可修改的包装器,“可修改,但在结构上不”当然与“不可修改”不同。

0
Pierre 回答 1小时 前

返回的列表Arrays.asList()可能是不可变的。你能试试吗

List list = new ArrayList<>(Arrays.asList(split));
Roman 回复 1小时 前

他在删除,ArrayList不是删除其值的最佳数据结构。LinkedList对他的问题有更多的感受。

Dimitris Andreou 回复 1小时 前

LinkedList错误。他是通过索引访问的,所以LinkedList将花费同样多的时间通过迭代来查找元素。有关更好的方法,请参阅我的答案,使用ArrayList。

0
Salim Hamidi 回答 1小时 前

我认为替换:

List list = Arrays.asList(split);

具有

List list = new ArrayList(Arrays.asList(split));

解决问题。

0
Andreas Dolk 回答 1小时 前

只需阅读JavaDoc中的asList方法:

返回对象的{@code List}

这是来自Java 6,但看起来android Java也是如此。
编辑
结果列表的类型为Arrays.ArrayList,它是数组中的私有类。班实际上,它只是传递给您的数组上的列表视图Arrays.asList. 结果是:如果更改数组,列表也会更改。而且,由于数组不可调整大小,请执行删除和添加操作必须不受支持。