4

我正在尝试创建一个对象列表,然后创建一个子列表,然后删除子列表中的所有元素,然后再次显示主列表。但是,当我尝试从子列表中删除元素时,在运行时 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);
    }
}
4

6 回答 6

4

的第二个索引subList是独占的,所以如果你想要 [1..3] 之间的元素,你需要使用:

List<Eval> sub = ev.subList(1, 4); 

此外,您尝试做的事情无论如何都不会起作用,因为List返回的实现subList没有实现该remove操作,所以您将得到一个java.lang.UnsupportedOperationException.

ArrayList您应该改为创建 sub :

ArrayList<Eval> sub = new ArrayList<Eval>(ev.subList(1, 4));
于 2012-01-25T17:54:50.413 回答
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);
}

}

于 2012-01-25T17:50:22.113 回答
1

您的子列表中没有索引为 2 的项目sub 所以错误是不言自明的。

索引从 0 开始。

在你的情况下

sub =  = {e2, e3}
sub[0] = e2
sub[1] = e3

因此,当您尝试删除索引 2 处的项目时,您会遇到运行时异常。如果您的目标是从列表中删除第二个元素,您应该调用

sub.remove(1)

于 2012-01-25T17:51:33.510 回答
1

你想说sub.remove(1)并且你想将列表声明为ArrayList- 不使用Arrays.asList。您的代码将抛出一个UnsupportedOperationException因为数组列表是固定长度的。

于 2012-01-25T17:51:44.780 回答
1

正如@Peter 所说,Java 中的索引是从 0 开始的,所以你需要使用:

sub.remove(1)

尽管如此,使用您当前的程序,您将获得 UnsupportedOperationException,因为 Arrays.asList() 返回一个不支持删除的固定大小的列表(这将反映到 ev,因为 subList() 反映了对原始列表的更改)。

您需要使用 List 接口的 ArrayList 或类似的可调整大小的实现。

于 2012-01-25T17:54:07.197 回答
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));   
    }
}

我允许自己对代码样式进行一些更改......但所有这些都有效(并经过测试)

希望这可以帮助!

于 2012-01-25T18:06:13.830 回答