今天项目需要操作一个字符串数组,分别分三种情况,A情况需要字符串数组为完整的 如 { "aa" , "bb" , "cc" },B情况需要删掉字符串数组里的 "aa" ,C情况需要删除"aa"和"bb"。
public class testT {
public static void main(String[] args) {
String[] a = { "aa", "bb", "cc"};
List<String> asList = Arrays.asList(a); //先把字符串数组转为List
for (int i = 0, len = list.size(); i < len; i++) { //然后遍历List,删除对应下标
if (list.get(i).equals("aa")) {
list.remove(i);
len--;
i--;
}
}
}
}
但是代码在list.remove这行报错了,java.lang.UnsupportedOperationException ,我对List做list.add操作也不行。
原因:查了一些资料,发现调用Arrays.asList()出来的List是Arrays的内部类ArrayList,而不是java.util.ArrayList。
Arrays的内部类ArrayList和java.util.ArrayList都是继承AbstractList,remove、add等方法AbstractList中是默认throw UnsupportedOperationException而且不作任何操作。java.util.ArrayList重写了这些方法而Arrays的内部类ArrayList没有重写,所以会抛出异常。
解决后:对list遍历remove删除时会将list的数据都往前一位,所以下标索引在remove之后要减一,这种遍历个人认为有点复杂臃肿,所以改用迭代器来删除。
public class testT {
public static void main(String[] args) {
String[] a = { "aa", "bb", "cc"};
List<String> asList = Arrays.asList(a);
List<String> list = new ArrayList(asList); //这里要再new一个真正的java.util.ArrayList
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()) {
String name = iterator.next();
if(iterator.next().equals("aa") || iterator.next().equals("bb")) {
iterator.remove();
}
}
}
}
这里 iterator.next().equals("aa") 这行又报错了,这次是迭代器的错误,因为本人很少用迭代器,有点生疏,查了一下相关迭代器的使用,发现应该是调用了两次iterator.next()的错误,这样会造成迭代器的指针向下移动了两次,指向的对象就不是我们要删除的对象了,所以也会抛出NoSuchElement的异常,所以要判断只能调用一次next方法。
解决后:
public class testT {
public static void main(String[] args) {
String[] a = { "aa", "bb", "cc"};
List<String> asList = Arrays.asList(a);
List<String> list = new ArrayList(asList);
Iterator<String> iterator = list.iterator();
while(iterator.hasNext()) {
String name = iterator.next();
if( name.equals("aa") || name.equals("bb") ) {
iterator.remove();
}
}
}
}
这样就没有问题了,完美删除需要删除String数组里的某个元素。
但是问题又来了,操作完List我需要继续把它转换回原先的字符串数组
String[] titleAry = (String[]) list.toArray();
这里我进行强转成我要的字符串数组,但是报错了,后面发现toArry方法返回的是Object [],查了一些资料,发现要返回一个特定的类型,需要toArray(T[] a)这个方法,并引入数组长度。
String[] titleAry = (String[]) list.toArray(new String[list.size()]);
这样即可正确转换回字符串数组。