我有这样的代码:

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


当前回答

对于这个问题,我有另一个解决方案:

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

工作在newList;)

其他回答

以下是来自Arrays的代码片段

public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }

    /**
     * @serial include
     */
    private static class ArrayList<E> extends AbstractList<E>
        implements RandomAccess, java.io.Serializable
    {
        private static final long serialVersionUID = -2764017481108945198L;
        private final E[] a;

所以当asList方法被调用时,它会返回它自己的私有静态类版本的列表,它不会覆盖AbstractList中的add函数来将元素存储在数组中。默认情况下,抽象列表中的add方法会抛出异常。

所以它不是正则数组列表。

创建一个新列表并在新列表中填充有效值对我来说很有用。

代码抛出错误-

List<String> list = new ArrayList<>();
   for (String s: list) {
     if(s is null or blank) {
        list.remove(s);
     }
   }
desiredObject.setValue(list);

修复后-

 List<String> list = new ArrayList<>();
 List<String> newList= new ArrayList<>();
 for (String s: list) {
   if(s is null or blank) {
      continue;
   }
   newList.add(s);
 }
 desiredObject.setValue(newList);

这个UnsupportedOperationException会在你试图对集合执行一些不允许的操作时出现,在你的情况下,当你调用数组时。asList不返回java.util.ArrayList。它返回一个java.util。数组$ArrayList是一个不可变列表。你不能向它添加,也不能从它删除。

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

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

对于这个问题,我有另一个解决方案:

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

工作在newList;)