当前位置: 首页 > 面试题库 >

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

司寇烨伟
2023-03-14
问题内容

我有以下代码:

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:返回指定数组支持的固定大小的列表。

你不能add做到 你不能remove。你无法在结构上修改List

Fix

创建一个LinkedList,支持更快remove

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

关于split正则表达式

从API:

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

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

固定:

template.split("\\|")

关于更好的算法

与其remove一次用一个随机索引调用一个数字,不如生成一个足够的范围内的随机数,然后用List一次遍历一次listIterator(),并remove()在适当的索引上调用,这更好。关于如何在给定范围内生成随机但不同的数字,有一些关于stackoverflow的问题。

这样,你的算法将是O(N)



 类似资料:
  • 我试图编辑我的deletar()方法,把一个迭代器移除元素,但没有工作,错误继续。

  • 问:反转一个列表(自己做方法,不要用集合) 我收到一个错误< code > UnsupportedOperationException 试验 我不明白为什么在< code>list.remove(0)上出现< code > UnsupportedOperationException ;

  • 我使用保存通过调用方法。然后,我尝试使用方法。但当我尝试这样做时,我得到了一个。这其中的原因是什么?我应该如何解决这个问题?

  • 使用JavaVersion9,我有一些测试代码可以从通过向DefaultListModel传递一个refrence创建的列表中删除一个项目。这就是我所做的。 > 创建DefaultListModel对象 通过调用addelement将8个元素添加到它(A..H)中 通过调用RemoveElement删除项 创建一个Jlist,将我的DefaultListModel的引用传递给它 列表框显示所有8个

  • 示例代码: 我正在类A中的页面上创建WebElement列表,在类B中,我试图单击第一个元素。 在执行时,我得到以下例外: 问题与findElement有关,因为当我在代码中手动使用findElement方法将元素添加到列表中时,代码运行良好。 在下面的示例中,我对findElements行进行了注释,并手动添加了元素,这段代码运行良好。 有人能告诉我出了什么问题吗?

  • 实际上,在按下一个按钮后,我有一个方法可以检查itemStorico ArrayList中是否存在从itemModel添加的新项,然后如果该项存在于名为itemModel的新列表中,我将从itemStorico中删除旧项并添加新项,否则只添加新项而不删除旧项。 但我得到以下错误: 下面是我的方法中的代码: