web-dev-qa-db-ja.com

リストの最初のn個の要素を配列に取得する最速の方法

配列に保存されているリストの最初のn個の要素を取得する最も速い方法は何ですか?

これをシナリオとして考えると:

int n = 10;
ArrayList<String> in = new ArrayList<>();
for(int i = 0; i < (n+10); i++)
  in.add("foobar");

オプション1:

String[] out = new String[n];
for(int i = 0; i< n; i++)
    out[i]=in.get(i);

オプション2:

String[] out = (String[]) (in.subList(0, n)).toArray();

オプション3:より速い方法はありますか?たぶん、Java8ストリームで?

31
Joel

オプション1はオプション2よりも速い

オプション2は新しいList参照を作成し、nからList要素配列を作成するためです(オプション1は出力配列のサイズを完全に調整します)。ただし、最初に1つのバグを修正する必要があります。 <を使用します(<=ではありません)。好む、

String[] out = new String[n];
for(int i = 0; i < n; i++) {
    out[i] = in.get(i);
}
8
Elliott Frisch

仮定、想定。推測:

リスト-リスト_<String>_

Java 8 Streams、

  • リストから最初のN個の要素をリストに取得するには、

    List<String> firstNElementsList = list.stream().limit(n).collect(Collectors.toList());

  • リストから最初のN個の要素を配列に取得するには、

    String[] firstNElementsArray = list.stream().limit(n).collect(Collectors.toList()).toArray(new String[n]);

38
src3369

nの大きさに大きく依存します。

_n==0_の場合、オプション#1に勝るものはありません:)

Nが非常に大きい場合、toArray(new String[n])は高速です。

3
ZhongYu