【问题标题】:java sublist removaljava子列表删除
【发布时间】:2012-01-25 17:45:55
【问题描述】:

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

【问题讨论】:

    标签: java list sublist


    【解决方案1】:

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

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

    此外,您尝试执行的操作无论如何都行不通,因为subList 返回的List 实现未实现remove 操作,因此您将获得java.lang.UnsupportedOperationException。

    您应该将 sub 创建为 ArrayList:

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

    【讨论】:

      【解决方案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);
      }
      

      }

      【讨论】:

      • 这不会让代码抛出IndexOutOfBounds,但还是会抛出UnsupportedOperationException,因为subList返回的列表没有实现remove操作。
      • 谢谢,我不知道!我已经修改了代码以避免这个问题。
      【解决方案3】:

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

      索引从 0 开始。

      你的情况

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

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

      sub.remove(1)

      【讨论】:

        【解决方案4】:

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

        sub.remove(1)
        

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            List 是有序类型。因此(据我了解)您不能只在列表中随机删除一个项目。它会改变顺序。

            这在这里,例如确实有效:

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

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

            希望这会有所帮助!

            【讨论】:

              猜你喜欢
              • 2019-02-08
              • 1970-01-01
              • 1970-01-01
              • 2018-04-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多