从List中删除符合条件的元素需要用到Iterator.remove()方法,但今天我发现如果List是通过Arrays.asList(数组)生成的话,则使用Iterator.remove()删除此List中的元素是会报告UnsupportedOperationException异常,这是何故?请高手赐教! 示例代码:
String[] strs = new String[]{"a","b","c","d","e"};List<String> strList = Arrays.asList(strs);
Iterator<String> it = strList.iterator();
while(it.hasNext()) {
if(it.next().equals("c")) {
it.remove();//报错
}
}
System.out.println(strs);
String[] strs = new String[]{"a","b","c","d","e"};List<String> strList = Arrays.asList(strs);
Iterator<String> it = strList.iterator();
while(it.hasNext()) {
if(it.next().equals("c")) {
it.remove();//报错
}
}
System.out.println(strs);
这个就是语义的问题了. 对于String[]类型来说, 你不可以删除里面的元素, 而导致后续的元素移动.
这个是Java语言的问题, 就是应该抛出这个异常的.
在java里, String s = "Hello";
s[0] = 'h';你不可能写出这样的代码, 因为s聚合的是final的char[].
道理是一样的.在C++善用const和模板就不会出现这样的尴尬, 因为const Type和Type是不同的类型, 很容易就可以造成编译错误, 而不是运行错误.
不支持这个方法而已拉`
class List
{
ListNode* head; List(const E* elements) {
//construct a linked list, and each element points to a array element
for(;;) {
ListNode* node = new ListNode;
node->data = elements[index];
node->next = ...
}
}
}伪码大致如此.
public static <T> List<T> asList(T... a) {
return new ArrayList<T>(a);
}////////////////////
private Object[] a;
////////////////////
ArrayList(E[] array) {
if (array==null)
throw new NullPointerException();
a = array;
}这些代码是我从Java源码里面copy出来的, private static class ArrayList<E> extends AbstractList<E>
implements RandomAccess, java.io.Serializable
这个类就是我说的Adapter了
List<String> list = new ArrayList<String>(Arrays.asList(arr));
for(Iterator<String> iter = list.iterator();iter.hasNext();) {
String s = iter.next();
if(StringUtils.isEmpty(s)) {
iter.remove();
}
}
这样就可以了。