根据多个索引删除需要从后往前删,避免先删除前面的元素后面的元素索引发生变化,创建索引集合倒序遍历
// 要删除的索引集合
List<Integer> list = Arrays.asList(0, 2, 4);
List<Integer> data = Arrays.asList(1,2,3,4,5);
for (int i = list.size() - 1; i >= 0; i--) {
if (i <= data.size()) {
data.remove(list.get(i));
}
}
执行后报错java.lang.UnsupportedOperationException,调用Arrays.asList()生产的List的add、remove方法时报异常,这是由Arrays.asList() 返回的是Arrays的内部类ArrayList, 而不是java.util.ArrayList。Arrays的内部类ArrayList和java.util.ArrayList都是继承AbstractList,remove、add等方法AbstractList中是默认throw UnsupportedOperationException而且不作任何操作。java.util.ArrayList重新了这些方法而Arrays的内部类ArrayList没有重写。
修改初始化集合的方法
List<Integer> data = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
再次执行发现结果并不是预期
因为list.get(i)不是int类型,而是integer对象
1、集合框架只能存放对象,不能存放基本数据类型,所以index取出来的是Integer对象,而不是你想要的int类型。(提醒一点,就算int类型存进去在集合里也是Integer类型)
2、list提供了两个remove方法,分别是remove(int index),remove(Object o),因为Integer对象也是Object类型的,所以匹配list.remove(Object o),不会进行拆箱,这也就解释了上门的结果是删除了等于0、2、4的元素,而不是索引为0、2、4的元素
最后附上完整代码
List<Integer> list = Arrays.asList(0, 2, 4);
// List<Integer> data = Arrays.asList(1,2,3,4,5); // Arrays内部类没有重写remove等方法
List<Integer> data = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
System.out.println(data);
for (int i = list.size() - 1; i >= 0; i--) {
if (i <= data.size()) {
// data.remove(list.get(i));// 装箱拆箱问题
data.remove(list.get(i).intValue());
}
}
System.out.println(data);