2012-01-25 13 views
4

私はオブジェクトのリストを作成してからサブリストを作成し、サブリストのすべての要素を削除してからメインリストを再度表示しようとしています。しかし、私がサブリストから要素を削除しようとすると、実行時のindexoutofboundsと不明なソースでエラーが発生します。アプリを動作させるように修正するには?javaサブリストの削除

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

答えて

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

}

+0

これにより、コードがIndexOutOfBoundsをスローすることはありませんが、subListから返されたリストには削除操作が実装されていないため、UnsupportedOperationExceptionがスローされます。 – Tudor

+0

ありがとう、私はそれを知らなかった!私はこの問題を避けるためにコードを修正しました。 – Peter

1

ので誤差は自明であるあなたのサブリストsub 上のインデックス2とは項目がありません。

インデックスでは、インデックス2にある項目を削除しようとするので、あなたはランタイム例外を取得

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

あなたのケースでは0

から始まります。 Arrays.asListを使用していない - あなたが目的であれば は、リストから2番目の要素を削除することで、 あなたがsub.remove(1)を言いたい、あなたがArrayListとしてリストを宣言したい

sub.remove(1)

1

を呼び出す必要があります。配列リストは固定長であるため、コードはそのままUnsupportedOperationExceptionになります。

1

@Peterは、あなたが使用する必要があるので、Javaでインデックスは0ベースで、言ったように:

sub.remove(1) 

それでも、あなたの現在のプログラムであなたはは、Arrays.asListとしてUnsupportedOperationExceptionが、(取得します) removeをサポートしていない固定サイズのリストを返します(subList()は元のリストへの変更を反映するため、evに反映されます)。

リスト・インタフェースのArrayListまたは同様のサイズ変更可能な実装を使用する必要があります。

4

subListの第二の指標は、排他的であるあなたがしたいので、もしあなたが使用する必要が[1..3]の間の要素:

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

さらに、あなたはとにかく動作しませんやろうとしているもの、 Listの実装がsubListによって返されたため、remove操作が実装されていないため、java.lang.UnsupportedOperationExceptionが返されます。

代わりArrayListとサブを作成する必要があります。

ArrayList<Eval> sub = new ArrayList<Eval>(ev.subList(1, 4)); 
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)); 
    } 
} 

このことができます:

これここで、例えば仕事しません!

関連する問題