Objective C コードをいくつか移植しています。
オブジェクトのリストを作成する必要があります (意味のあるものであれば、どのような種類のリストも使用します)。クラスは次のようになります。
class Foo{
double fooValue1;
double fooValue2;
double fooValue3;
double fooValue4;
}
正常に動作するバイト配列にバイナリ ファイルを読み込んでいます。バイト配列は、4 つの double のリストです。したがって、ファイルに Foo のインスタンスが 100 個ある場合、バイト配列は 3200 バイトになります。つまり、4 * 8 * 100 です。
Objective C では、変数は Foo 型の配列へのポインタとして宣言されます。バイトをコピーするだけでその配列をロードするのは非常に高速です。これを行うステートメントは次のとおりです。
[byteArray getBytes:fooData range:range]
ここで、range はNSRange
ロケーション = 0 および長さ = バイト配列の長さのインスタンスであり、byteArray はファイルから読み取られた生の byte[] であり、fooData はターゲット配列へのポインターです。
現時点では、バイト配列をループして、32 バイトごとに Foo の新しいインスタンスを作成し、8 バイトごとに double に変換してフィールドを割り当てています。何千ものオブジェクトの場合、これは遅くなります。
私は API 8 をターゲットにしているArrays.copyOf
ので利用できませんが、それが良い解決策を提供する場合は、ターゲットを変更することを検討します。
質問は; Objective C と同様の「1 つのステートメント」の方法でリストを作成する方法はありますか?
ありがとう
[編集]ピーターの答えに基づいて使用した最終的なコードは次のとおりです。ファイルには、ヘッダーで区切られたリストのリストが実際に含まれていることを付け加えておきます。ファイルを解析した結果は、バイト配列の配列です。
ArrayList<SCGisPointData> pointData = new ArrayList<SCGisPointData>();
SCGisPointData thisPointdata;
for (byte[] ring : linearRings) {
DoubleBuffer buffer = ByteBuffer.wrap(ring).order(ByteOrder.nativeOrder()).asDoubleBuffer().asReadOnlyBuffer();
thisPointdata= new SCGisPointData ();
while (buffer.hasRemaining()) {
thisPointdata = new SCGisPointData();
thisPointdata.longitude = buffer.get();
thisPointdata.latitude = buffer.get();
thisPointdata.sinLatitude = buffer.get();
thisPointdata.cosLatitude = buffer.get();
pointData.add(thisPointdata);
}
}