3

整数 (またはプリミティブ int) にマップする必要があるオブジェクトがあります。

たとえば

Object[] objects = new Object[X];
objects[2]=o1;
objects[34]=o2;
objects[126]=o3;
...

したがって、キーの範囲は 0 から X ですが、必要なのは少数 (20 としましょう) のマッピング ペアだけです。(マッピングは一度だけ行われ、変更されません)

ほとんど使用されていない「大きな」配列の代わりに、(パフォーマンスとメモリ使用量のバイス) Map を使用すること (およびどの実装が最適か) を使用することをお勧めします。

必要な範囲は、実際には開発中に後でスケールアップする可能性があります. (現在、X は 256 です。かなり小さいです)

要約すると、Java で Numbers を Objects に効率的にマップしたいと考えています。

4

7 に答える 7

3

マップを使用します。

パフォーマンスの違いは無視できるはずです。「パフォーマンス」と言うとき、ルックアップを参照していると仮定すると(マッピングは1回だけ行われ、変更されないと言ったように)、直接配列ルックアップを使用するとパフォーマンスが向上します。配列を使用すると、予想されるルックアップは になりますO(1)。マップがあり、整数をキーとして使用している場合、ルックアップはO(1)予想されるケースとO(n)最悪のケースである必要があります。あなたが言及した少数のペア (20) を考えると、パフォーマンスの違いは重要ではありません。

ただし、配列はまばらに設定されるため、マップのメモリ使用量は大幅に改善されます。

アップデート

コメントやフィードバックを提供し、私が学ぶのを助けてくれたすべての人に感謝します. @JohnnyO は、配列ルックアップが であると述べて正しかったのでO(1)、彼のフィードバックに基づいて投稿を修正しました。私はArrayListを考えていました。

于 2013-01-23T01:22:57.793 に答える
2

最速の可能性(配列)を使用するか、を使用するかHashMapは、アプリケーションによって異なります。1秒あたり数百万の計算(配列アクセス)がありますか?はい、次にアレイを取得し、1kのメモリを消費します。
そうでなければ、地図を取ります。
ただし、xが大きい場合は、3番目の解決策があります。この解決策はマップとほぼ同じくらい高速ですが(おそらく高速です)、
使用するスペースは少なくなります。オブジェクト配列へのインデックスとしてintの並べ替えられた配列を使用します。

int[] idx ={2, 34, 126}
Object[] objs = {o1, o2, o3};

Idxは昇順で並べ替える必要があります。キー34のオブジェクトを取得します。

int pos= Arrays.binsearch(34, idx); // params might be wrong, please correct
Object o = objs[pos];

しかし、これは、実行時にオブジェクトが変更されない、最小限のストレージスペース要件を持つ多数のオブジェクトにのみ使用します。

于 2013-01-23T02:08:36.213 に答える
1

あなたが言うように、地図はまさにそれを行うための良い方法です。ハッシュマップは非常に高速であるため、通常はハッシュマップを使用します。ただし、配列ほど高速ではありません。値ごとに 1 つのキーしかない場合は、キーごとに 1 つの値のみが使用されるようにするため、HashSet を使用することもできます。

Android API には SparseIntArray と呼ばれるものがあり、パフォーマンスが向上するはずですが、標準の Java API では見たことがありません。

パフォーマンスが本当に重要な場合は、trove ライブラリに適切なスパース配列またはマップがあることに気付くかもしれません。プリミティブを使用している場合にのみ高速になる傾向があります(あなたの場合はそうです)

于 2013-01-23T01:27:38.370 に答える
1

実際に必要なのは SparseArray です。これは、法線マップと配列の間の妥協点です。

Android 向けに開発している場合は、1 つ利用できます (以下のリンクを参照)。それ以外の場合は、おそらく利用可能な実装を見つけることができます。

http://developer.android.com/reference/android/util/SparseArray.html

于 2013-01-23T01:29:22.907 に答える
1

Mapこれは本当にそのために作られたものなので、私は a を使用します。さらに、 を使用するMapと、将来的にコードを更新および管理しやすくなります。どの実装を使用する必要があるかについては、 a で十分だと思われますがHashMap、整数キーを順番に保持したい場合は、 a も検討することをお勧めしますTreeMap

于 2013-01-23T01:20:56.977 に答える
1

配列は明らかに最速のアクセスを提供しますが、そのようなギャップがある場合、かなりの量のスペースを無駄にすることになります.

キー (整数など) を値に関連付ける柔軟なデータ構造を探していて、範囲にギャップがあり、後でそれを増やす可能性がある場合、私はこれ以上適切なものを考えられません地図。挿入する予定の要素の数が正確にわかっている場合は、HashMap などの実装に対するコンストラクター パラメーターを調査することをお勧めします。これにより、基礎となるストレージのサイズを調整して、スペースと衝突を減らすことができます。

Map のもう 1 つの結果は、それを使用して他のコレクション指向のタスクを実行する必要がある場合に備えて、はるかに豊富な API を取得できることです。

于 2013-01-23T01:22:29.520 に答える
0

私がマップをお勧めする理由の 1 つは、可変長です。マッピングする必要があるオブジェクトの数を追跡するのは、おそらくかなり面倒になるでしょう。または同様の実装を使用するHashMapと、マッピング オブジェクトに常に十分な容量があることが保証されます。それ以外は、マップを使用する方が理にかなっています。これは、コードが他の人にとって読みやすくなるように設計されているためです。生の配列はメモリの消費量が少ないと思いますが、現実的には、マップのオーバーヘッドは、あなたが話しているスケールではそれほど重要ではありません.

于 2013-01-23T01:24:21.747 に答える