JavaでArrayList
の配列スライスを取得するにはどうすればよいですか?具体的には、私はこのようなことをしたいです:
ArrayList<Integer> inputA = input.subList(0, input.size()/2);
// where 'input' is a prepouplated ArrayList<Integer>
だから私はこれがうまくいくと思っていましたが、JavaはList
を返します-互換性がありません。キャストしようとすると、Javaウォンさせてくれません。ArrayList
が必要です-何ができますか?
Javaでは、APIの具体的なクラスではなく、インターフェイスタイプを使用することをお勧めします。
あなたの問題は、本当にArrayList
を使用する必要がある場所でList
(おそらく多くの場所で)を使用していることです。その結果、リストがArrayList
であるという不必要な制約により、自分で問題を作成しました。
コードは次のようになります。
List input = new ArrayList(...);
public void doSomething(List input) {
List inputA = input.subList(0, input.size()/2);
...
}
this.doSomething(input);
問題に対して提案された「解決策」は次のとおりです。
new ArrayList(input.subList(0, input.size()/2))
これは、サブリストのコピーを作成することで機能します。通常の意味でのスライスではありません。さらに、サブリストが大きい場合、コピーの作成には費用がかかります。
変更不可のようなAPIに制約されている場合変更する必要があるinputA
をArrayList
として宣言すると、 ArrayList
メソッドがsubList
のサブクラスを返すArrayList
のカスタムサブクラスを実装します。しかしながら:
ArrayList
クラスのドキュメント化されていない側面(したがって、「変更の対象」)側面に依存する可能性がある、重要な新しいクラスをコードベースに追加しました。ArrayList
インスタンスを作成しているコードベースの関連する場所を変更する必要があります。「アレイのコピー」ソリューションはより実用的です...これらは真のスライスではないことに留意してください。
既存のメソッドが存在しない場合、0からinput.size()/2
まで繰り返し、連続する各要素を取得して新しいArrayListに追加できると思います。
[〜#〜] edit [〜#〜]:実際、そのリストを取得し、それを使用して新しいArrayListをインスタンス化することができると思います- ArrayListコンストラクターの1つ 。
ArrayListから削除する必要がある要素のstartIndexとendIndexを知っている場合、私は方法を見つけました
al
を元のArrayListに、startIndex
、endIndex
を配列から削除する開始インデックスと終了インデックスにそれぞれします。
al.subList(startIndex, endIndex + 1).clear();
この投稿は非常に古いものですが。誰かがこれを探している場合.
Guavaは、リストを指定されたサイズのサブリストに分割しやすくします
List<Integer> intList = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8);
List<List<Integer>> subSets = Lists.partition(intList, 3);