リストを指定された数の要素に切り詰めます


120

どのような方法でリストを切り捨てます-たとえば最初の100要素まで-他の要素を破棄します(個々の要素を繰り返すことなく)?

回答:


141

使用List.subList

import java.util.*;
import static java.lang.Math.min;

public class T {
  public static void main( String args[] ) {
    List<String> items = Arrays.asList("1");
    List<String> subItems = items.subList(0, min(items.size(), 2));

    // Output: [1]
    System.out.println( subItems );

    items = Arrays.asList("1", "2", "3");
    subItems = items.subList(0, min(items.size(), 2));

    // Output: [1, 2]
    System.out.println( subItems );
  }
}

subListはアイテムのビューを返すことを覚えておいてください。したがって、リストの残りの部分をガベージコレクションの対象にしたい場合は、必要なアイテムをnewにコピーする必要がありますList

List<String> subItems = new ArrayList<String>(items.subList(0, 2));

リストが指定されたサイズより短い場合は、範囲外の例外が予想されますます。目的のサイズの最小値とリストの現在のサイズを終了インデックスとして選択します。

最後に、2番目の引数は、最後に必要なインデックスよりも1つ多い必要があることに注意してください。


1
質問は明確ではありませんが、samがリストの最後を削除したいようです。したがって、答えにはlist.clear()を含める必要があります。
mP。

これは、karim79のソリューションほどうまく機能しない可能性があります。これは、最良の代替手段です。うまく機能する可能性が最も高く、コードも最もクリーンです。
Lawrence Dol、

削除する要素の数に依存すると思います(また、リストが変更をサポートしているかどうか)
Ben Lings

1
Javaの8がオプションであれば、私が思うにStream.limit、トリック(行う必要がありますdocs.oracle.com/javase/8/docs/api/java/util/stream/...
エランメダン

53
list.subList(100, list.size()).clear();

または:

list.subList(0, 100);

3
最初のオプションはリストを変更しますが、2番目のオプションは変更しません。list = list.subList(0, 100)
shoud

3
また、それに注意しsubList(100, list.size()).clear()、作成した場合は、リストには、例えば、その明確なメソッドが実装されている場合のみとなります仕事をlistすることによってList<String> list = Arrays.asList(someString.split(","));(クリアスローされます)UnsupportedOperationExceptionので、list抽象的になりますList
Gyuri

リストの最初のn要素を保持する場合は、次のようにする必要がありますlist.subList(n, list.size()).clear();
Chaklader Asfak Arefe

1
リストを短くするためだけにオブジェクトを作成しなければならないのは残念です
David Bradley

1
@DavidBradley Trueですが、HotSpotはこれを実際に最適化する可能性があります
Stefan Reich

8

subList他の回答で示唆されているように、最初に思い浮かぶのはそれです。ストリームアプローチもお勧めします

source.stream().limit(10).collect(Collectors.toList()); // truncate to first 10 elements
source.stream().skip(2).limit(5).collect(Collectors.toList()); // discards the first 2 elements and takes the next 5
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.