首页 > Java >  Java为什么在尝试从列表中删除元素时会出现 UnsupportedOperationException?

 Java为什么在尝试从列表中删除元素时会出现 UnsupportedOperationException?

上一篇 下一篇

我有这个代码:

public static String SelectRandomFromTemplate(String template,int count) {
   String[] split = template.split("|");
   List<String> 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

分割线

网友回答:

你的代码有很多问题:

返回固定大小的列表时Arrays.asList

从 API :

Arrays.asList:返回由指定数组支持的固定大小列表

你不能做到;你不能从它。不能从结构上修改 .addremoveList

修复

创建一个 ,它支持更快的 。LinkedListremove

List<String> list = new LinkedList<String>(Arrays.asList(split));

关于采取正则表达式split

从 API :

String.split(String regex):围绕给定正则表达式的匹配项拆分此字符串。

|是一个正则表达式元字符;如果要在文字上拆分,则必须将其转义为 ,作为 Java 字符串文字,它是 。||"\|"

修复:

template.split("\|")

关于更好的算法

与其使用随机索引一次调用一个,不如在该范围内生成足够的随机数,然后使用 遍历一次,在适当的索引处调用。关于如何在给定范围内生成随机但不同的数字,堆栈溢出存在问题。removeListlistIterator()remove()

有了这个,您的算法将是.O(N)

分割线

网友回答:

这个已经烧了我很多次了。 创建不可修改的列表。
从 Javadoc:返回由指定数组支持的固定大小列表。
Arrays.asList

创建具有相同内容的新列表:

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

这将产生一些额外的垃圾,但您将能够改变它。

分割线

网友回答:

可能是因为您正在使用不可修改的包装器。

更改此行:

List<String> list = Arrays.asList(split);

到这一行:

List<String> list = new LinkedList<>(Arrays.asList(split));

模板简介:该模板名称为【 Java为什么在尝试从列表中删除元素时会出现 UnsupportedOperationException?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【Java】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 256次
  • 使用软件 Sublime/Dreamweaver/HBuilder
  • 文件格式 编程语言
  • 文件大小 暂无信息
  • 上传时间 04-17
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
微信公众平台 微信素材 微信文章 企业网站 自适应 单页式简历模板 响应式 微信模板 微信图片 html5
您可能会喜欢的其他模板