我正在尝试创建对象列表,然后创建子列表,然后删除子列表中的所有元素,然后再次显示主列表。但是,当我尝试从子列表中删除元素时,我在运行时indexoutofbounds和未知来源时收到错误。如何解决这个问题,以便应用程序有效?
import java.util.*;
class Eval{
Eval(){
}
}
public class Ch11Ex7 {
public static void main(String[] args){
Eval e1 = new Eval();
Eval e2 = new Eval();
Eval e3 = new Eval();
Eval e4 = new Eval();
Eval e5 = new Eval();
Eval[] eva = {e1, e2, e3, e4, e5};
//ArrayList<Eval> ev = new ArrayList<Eval>(Arrays.asList(eva));
List ev = Arrays.asList(eva);
List<Eval> sub = ev.subList(1, 3);
for(int i=0; i< ev.size() ; i++)
System.out.println(ev.get(i));
System.out.println("Sublist");
for(int i=0; i< sub.size() ; i++)
System.out.println(sub.get(i));
System.out.println("Remove element");
sub.remove(2);
}
}
答案 0 :(得分:4)
subList
的第二个索引是独占的,所以如果你想要[1..3]之间的元素你需要使用:
List<Eval> sub = ev.subList(1, 4);
此外,您尝试执行的操作无论如何都无法正常工作,因为List
返回的subList
实现未实现remove
操作,因此您将获得{{1} }}。
您应该创建sub为java.lang.UnsupportedOperationException
而不是:
ArrayList
答案 1 :(得分:2)
Java列表为零索引,因此:
List<Eval> sub = ev.subList(1, 3) // = {e2, e3} (subList is not inclusive on second index)
和
sub.remove(2); // Attempts to remove 3rd element from 2 element list
因此,将索引减少一个。
import java.util.*;
class Eval{
Eval(){
}
}
public class Ch11Ex7 {
public static void main(String[] args){
Eval e1 = new Eval();
Eval e2 = new Eval();
Eval e3 = new Eval();
Eval e4 = new Eval();
Eval e5 = new Eval();
Eval[] eva = {e1, e2, e3, e4, e5};
//ArrayList<Eval> ev = new ArrayList<Eval>(Arrays.asList(eva));
List ev = Arrays.asList(eva);
List<Eval> sub = ev.subList(0, 2);
sub = new ArrayList<Eval>(sub);
for(int i=0; i< ev.size() ; i++)
System.out.println(ev.get(i));
System.out.println("Sublist");
for(int i=0; i< sub.size() ; i++)
System.out.println(sub.get(i));
System.out.println("Remove element");
sub.remove(1);
}
}
答案 2 :(得分:1)
子列表sub
上没有包含索引2的项
所以错误是自我解释的。
索引从0开始。
在你的情况下
sub = = {e2, e3}
sub[0] = e2
sub[1] = e3
因此,当您尝试删除索引2处的项时,您将获得运行时异常。 如果你的目标是从列表中删除第二个元素, 你应该打电话
sub.remove(1)
答案 3 :(得分:1)
您想说sub.remove(1)
并且您想要将列表声明为ArrayList
- 而不是Arrays.asList
。您的代码将抛出UnsupportedOperationException
因为数组列表是固定长度。
答案 4 :(得分:1)
正如@Peter所说,Java中的索引是基于0的,所以你需要使用:
sub.remove(1)
仍然,使用当前程序,您将获得UnsupportedOperationException,因为Arrays.asList()返回不支持remove的固定大小列表(由于subList(将反映到ev) )反映原始列表的变化。)
您需要使用ListList或类似的可调整大小的List接口实现。
答案 5 :(得分:1)
列表是有序类型。因此(根据我的理解)你不能只是在列表中随机删除一个项目。它会改变顺序。
这就是这里的工作:
public class Ch11Ex7 {
public static void main(String[] args){
Eval e1 = new Eval();
Eval e2 = new Eval();
Eval e3 = new Eval();
Eval e4 = new Eval();
Eval e5 = new Eval();
Eval[] eva = {e1, e2, e3, e4, e5};
ArrayList<Eval> ev = new ArrayList<Eval>(Arrays.asList(eva));
ArrayList<Eval> sub = new ArrayList<Eval>(ev.subList(1, 3));
printList(ev);
System.out.println("Sublist");
printList(sub);
System.out.println("Remove element");
sub.remove(1);
System.out.println("New List");
printList(ev);
System.out.println("Sublist");
printList(sub);
}
public static void printList(List<Eval> list) {
for(int i=0; i< list.size() ; i++)
System.out.println(list.get(i));
}
}
我允许自己对代码风格进行一些更改......但总而言之,这些工作(并经过测试)
希望这有帮助!