[英]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.