4

オブジェクトのリストを作成してからサブリストを作成し、サブリスト内のすべての要素を削除してから、もう一度メインリストを表示しようとしています。ただし、サブリストから要素を削除しようとすると、実行時の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);
    }
}
4

6 に答える 6

4

の2番目のインデックスsubListは排他的であるため、[1..3]の間の要素が必要な場合は、次を使用する必要があります。

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

Listさらに、によって返される実装は操作をsubList実装しないため、実行しようとしていることはとにかく機能しません。そのため、を取得します。removejava.lang.UnsupportedOperationException

ArrayList代わりにsubを作成する必要があります。

ArrayList<Eval> sub = new ArrayList<Eval>(ev.subList(1, 4));
于 2012-01-25T17:54:50.413 に答える
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

したがって、インデックスを1つ減らします。

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

}

于 2012-01-25T17:50:22.113 に答える
1

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

sub.remove(1)

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

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

于 2012-01-25T17:54:07.197 に答える
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));   
    }
}

コードスタイルにいくつかの変更を加えました...しかし、全体としてこれは機能します(そしてテスト済み)

お役に立てれば!

于 2012-01-25T18:06:13.830 に答える
1

サブリストにインデックス 2 のアイテムがないためsub 、エラーは自明です。

インデックスは 0 から始まります。

あなたの場合

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

したがって、インデックス 2 の項目を削除しようとすると、実行時例外が発生します。リストから2番目の要素を削除することが目的の場合は、呼び出す必要があります

sub.remove(1)

于 2012-01-25T17:51:33.510 に答える
1

sub.remove(1)ANDと言い、リストを -not ArrayListusingとして宣言しArrays.asListます。UnsupportedOperationException配列リストは固定長であるため、コードはそのままスローします。

于 2012-01-25T17:51:44.780 に答える