3

重複の可能性:
オブジェクトの配列をプリミティブ型の配列に変換する

ParcelはAndroid用に作成していて、ArrayList<Long>(toArrayが私に与えるLong[])をに変換してパッケージ化しようとしていますlong[]が、これを行う簡単な方法はありますか?

ループできることはわかっていますが、もっとエレガントなソリューションを探していると思います。

4

3 に答える 3

10

ApachecommonsArrayUtilsを使用できます。

long[] longArray = ArrayUtils.toPrimitive(longObjectArray);

またはGoogleのグアバで:

long[] longArray = Longs.toArray(Arrays.asList(longObjectArray));
于 2012-11-24T18:11:00.100 に答える
6

残念ながら、ループするより簡単な方法はありません。この投稿は反対のことをすることについてですが、考え方は同じです...

別の回答ではApacheCommonsが推奨されており、Androidを使用しているため、追加の依存関係を含める場合は、guavaLongsユーティリティクラスを使用します。

long[] primitive = Longs.toArray(listOfLongObjects);

参考までに、コードは次のとおりです。

  public static long[] toArray(Collection<? extends Number> collection) {
    if (collection instanceof LongArrayAsList) {
      return ((LongArrayAsList) collection).toLongArray();
    }

    Object[] boxedArray = collection.toArray();
    int len = boxedArray.length;
    long[] array = new long[len];
    for (int i = 0; i < len; i++) {
      // checkNotNull for GWT (do not optimize)
      array[i] = ((Number) checkNotNull(boxedArray[i])).longValue();
    }
    return array;
  }
于 2012-11-24T18:11:21.340 に答える
2

Longlongは異なるタイプです。Longクラスです。longプリミティブです。LongJava 5に導入されたオートボクシングは、との間の双方向変換がlongコンパイラによって自動的に行われるため、一部の人々を混乱させる可能性があります。ただし、これはアレイには正しくありません。これは、タイプの新しい配列を作成しlong、要素ごとにコピーする必要があることを意味します。

List<Long> list = new ArrayList<>();
// this way you create array of Long
Long[] arr1 = list.toArray(new Long[list.size()]);

// this way you create array of long
long[] arr2 = new long[list.size()];
int i = 0;
for (Long e : list) {
    arr2[i++] = e; // autoboxing does the job here
}

System.arrcopy()もちろん、自分でループを書く代わりに使用することができます。ただし、idは何の違いもありません。

于 2012-11-24T18:16:16.433 に答える