簡體   English   中英

java子列表刪除

[英]java sublist removal

我正在嘗試創建一個對象列表,然后創建一個子列表,然后刪除子列表中的所有元素,然后再次顯示主列表。 但是,當我嘗試從子列表中刪除元素時,我在運行時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);
    }
}

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

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

}

子列表sub上沒有索引2的項目因此錯誤是自解釋的。

索引從0開始。

在你的情況下

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

因此,當您嘗試在索引2處刪除項時,您將獲得運行時異常。 如果你的目標是從列表中刪除第二個元素,你應該打電話

sub.remove(1)

你想說sub.remove(1)並且你想要將列表聲明為ArrayList - 而不是使用Arrays.asList 您的代碼將拋出UnsupportedOperationException因為Arrays列表是固定長度的。

正如@Peter所說,Java中的索引是基於0的,所以你需要使用:

sub.remove(1)

仍然 ,使用當前程序,您將獲得UnsupportedOperationException,因為Arrays.asList()返回不支持remove的固定大小列表(由於subList()反映了對原始列表的更改,因此將反映到ev)。

您需要使用ListList或類似的可調整大小的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));   
    }
}

我已經允許自己對代碼風格進行一些更改......但總而言之這些工作(並經過測試)

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM