java子列表删除

时间:2012-01-25 17:45:55

标签: java list sublist

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

6 个答案:

答案 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));   
    }
}

我允许自己对代码风格进行一些更改......但总而言之,这些工作(并经过测试)

希望这有帮助!