メモリ節約のためとかで、配列使ってコーディングしてて、以下のような関数つくった↓
/** 2つの配列をマージしてソートした新しい配列かえす */ def arraySort(array1:Array[Long],array2:Array[Long]):Array[Long] = { val newArray = new Array[Long]( array1.length + array2.length ) System.arraycopy(array1 , 0 , newArray , 0 , array1.length ) System.arraycopy(array2 , 0 , newArray , array1.length , array2.length ) java.util.Arrays.sort( newArray ) newArray }
ジェネリックにしてしまうと、プリミティブ型指定した場合に、boxingとかされると思ったので、あえてLong専用にしてみた。(どうせLongでしか使わない予定なので)
ていうか、そういう時のために、specializedアノテーションってあるんだろうけど、ちゃんと使い方知らないorz
単につければいいんだっけ?
あと、java.util.Arrays.sortってクイックソートって書いてあるけど、もとの2つの配列がそれぞれのソート済みだったら、もっとはやいアルゴリズムがあった気がする。*1
こういう本当にメモリを節約したい場合に、配列を使わないといけなるなるのは、JVM上に言語を構築したっていうのが不利になってる部分ですねぇ・・・。
LispにとってのListみたいに、基本のデータ構造がListで、それが言語組み込みだったら、そういうことあまり気にしなくていいんだろうけど・・・
ちなみに、逆コンパイルすると、ほんとそのまんま↓
public long[] arraySort(long array1[], long array2[]) { long newArray[] = new long[array1.length + array2.length]; System.arraycopy(array1, 0, newArray, 0, array1.length); System.arraycopy(array2, 0, newArray, array1.length, array2.length); Arrays.sort(newArray); return newArray; }