web-dev-qa-db-ja.com

List <Integer>を繰り返しなしでint [](配列)に変換する効率的な方法

  public static int[] convertListToArray(List<Integer> listResult) {
        int[] result = new int[listResult.size()];
        int i= 0;
        for (int num : listResult) {
            result[i++] = num;
        }
        return result;
    }

Listを明示的に繰り返すことなくListを配列に変換する効率的な方法はありますか?多分それは次のような方法を使用することで可能です:

Arrays.copyOf(int [] Origin , int newLength );
System.arraycopy(Object src,  int  srcPos,
                                    Object dest, int destPos,
                                    int length);

here と記述された解決策があることを知っています。ただし、List<Integer>int[]に変換する効率的な方法に特に興味があります

14
Tim Florian

Integerからintに変換する必要があることを考えると、実行時の効率について話していると仮定すると、あなたが持っているものよりも効率的なものを見つけるとは思わないでしょう。

might最初にInteger[]に変換してからループする方が効率的かもしれません(以下)が、notも可能です。特定のシナリオでテストして確認する必要があります。

その例を次に示します。

int size = listResult.size();
int[] result = new int[size];
Integer[] temp = listResult.toArray(new Integer[size]);
for (int n = 0; n < size; ++n) {
    result[n] = temp[n];
}
9
T.J. Crowder

効率が第一の関心事である場合、listResultで RandomAccess である場合、listResultでインデックス付きforループを使用することにより、ソリューションを使用してより効率的にできると思います。ただし、これによりコードの可読性が大幅に低下するため、ユースケースのベンチマークを行い、より効率的かどうかを確認する必要があります。

public static int[] convertListToArray(List<Integer> listResult) {
    int size = listResult.size();
    int[] result = new int[size];
    if (listResult instanceof RandomAccess)
    {
        for (int i = 0; i < size; i++)
        {
            result[i] = listResult.get(i);
        }
    }
    else
    {
        int i = 0;
        for (int num : listResult) {
            result[i++] = num;
        }
    }
    return result;
}

Java 8を使用し、より少ないコードを記述したい場合は、Streamsライブラリを使用できます。

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int[] array = list.stream().mapToInt(i -> i).toArray();

サードパーティのライブラリを使用する場合は、次のように Eclipse Collections を実行できます。

MutableList<Integer> list = Lists.mutable.with(1, 2, 3, 4, 5);
int[] array = list.collectInt(i -> i).toArray();

以下は少しコードが多くなっていますが、Eclipseコレクションを使用して考え出した最も効率的なソリューションです。

MutableList<Integer> list = Lists.mutable.with(1, 2, 3, 4, 5);
int[] array = new int[list.size()];
list.forEachWithIndex((each, index) -> array[index] = each);

Java.util.Listインターフェイスを使用する必要がある場合は、Eclipse Collectionsから ListIterate ユーティリティクラスを使用できます。

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int[] array = new int[list.size()];
ListIterate.forEachWithIndex(list, (each, index) -> array[index] = each);

ListIterateユーティリティは、RandomAccessリストと非RandomAccessリストに対して異なる反復コードを使用します。

最も効率的な方法は、Eclipse Collectionsまたはプリミティブコレクションをサポートする別のライブラリでList<Integer>MutableIntList に変更することです。

注:私はEclipse Collectionsのコミッターです。

11
Donald Raab

In Java 8:

int[] anArray = list.stream()
                    .filter(Objects::nonNull)
                    .mapToInt(Integer::intValue)
                    .toArray();
4
Saxintosh