Javaで有効なサブリストを取得するにはどうすればよいですか?

2011年05月31日に質問されました。  ·  閲覧回数 43k回  ·  ソース

George Kastrinis picture
2011年05月31日

私はJavaでこの奇妙な(私が思う)問題を抱えています。 ArrayListがあり、サブリストを取得したいと思います。 しかし、次の例外が発生します。

package javatest;

import java.util.ArrayList;

public class JavaTest {

    public static void main(String[] args) {
        ArrayList<Integer> alist = new ArrayList<Integer>();
        alist.add(10);
        alist.add(20);
        alist.add(30);
        alist.add(40);
        alist.add(50);
        alist.add(60);
        alist.add(70);
        alist.add(80);
        ArrayList<Integer> sub = (ArrayList<Integer>) alist.subList(2, 4);
        for (Integer i : sub)
            System.out.println(i);
    }
}

実行:スレッド「main」の例外java.lang.ClassCastException:java.util.RandomAccessSubListをjavatest.JavaTest.main(JavaTest.java:17)のjava.util.ArrayListにキャストできませんJava結果:1

サブリストを取得する正しい方法は何ですか?

THX

回答

SwapnilM picture
2011年12月15日
46

次のようにします:

List sublist = new ArrayList();
sublist = new ArrayList<String>(alist.subList(2, 4));

そしてそれはうまくいくはずです

stevevls picture
2011年05月31日
24

可能な限り、コレクションのインターフェースを使用する必要があります。 サブリストの結果をダウンキャストしていますが、APIは、( ArrayListではなく) ArrayList List返すように指定しています。 ここでは、実装者は自分たちの生活を楽にするために別のタイプを返すことを選択しています。

さらに、APIドキュメントでは、サブリストが元のリストにマップされたリストを返すように指定されているため、注意してください。

Karl-Bj&#248;rnar &#216;ie picture
2011年05月31日
8

これを試して...

List<Integer> alist = new ArrayList<Integer>();
alist.add(10);
alist.add(20);
alist.add(30);
alist.add(40);
alist.add(50);
alist.add(60);
alist.add(70);
alist.add(80);
List<Integer> sub = alist.subList(2, 4);
for (Integer i : sub)
  System.out.println(i);
Thor picture
2011年05月31日
3

試してみてください

List<Integer> sub = alist.subList(2, 4);
zg_spring picture
2012年10月31日
2
    public List<E> subList(int fromIndex, int toIndex) {
    return (this instanceof RandomAccess ?
            new RandomAccessSubList<E>(this, fromIndex, toIndex) :
            new SubList<E>(this, fromIndex, toIndex));
    }

ArrayListのimplの場合と同様に、@ George Kastrinisが可能な限りインターフェイスを使用すると述べたように、これはreturnListです。

helpermethod picture
2011年05月31日
0

コードを次のように変更します。

List<Integer> sub = alist.subList(2, 4);

sublist()メソッドはList返しますが、これは必ずしもArrayListある必要はありません(ここでは実際にはRandomAccessSublistであるため、キャストは失敗します)。