2012-02-10 16 views
4

まだ使用されていない、つまりサイズより小さいArrayListのインデックスに値を格納することはできません。私はJava:ArrayListの任意のインデックスに格納する最良の方法

myArrayList.set(10, "Hello World") 

を行うにしようとmyArrayList.size()は、その後、5であれば、他の言葉で、私は、境界エラーのうちを取得します。しかし、私のアプリはこれを必要とします。各中間スロットにヌルを格納するループ以外に、よりエレガントな方法がありますか?それは次のように私には見えます

:私は(POS Xでの、すなわち要素)をランダムアクセスできるようにする必要がある場合

  • この動作はその後、私の選択肢はベクトルとArrayListのあるベクトル
  • でも同じです。
  • 私はHashMapを使用し、インデックスとしてキーを使用することができますが、それは本当に非効率です。

だから、よくあるケースのように見えます。私は何かが欠けている必要があります...

+3

なぜマップソリューションが本当に非効率的なのでしょうか?あなたのスペース要件はどれくらい厳しいですか? –

+0

HashMapをArrayListで提案する方法よりも効率が悪いのはなぜですか? –

+0

また、最も高いインデックスがどのようなものになるか、事前に知っていますか? –

答えて

4

私はHashMapを使用し、インデックスとしてキーを使用することができますが、それは本当に非効率的です。

に依存します。使用するインデックスが非常にまばらな場合は、マップを使用するほうがずっと良いかもしれません。インデックスが密接に関連している傾向がある場合は、nullを設定するよりも良い方法はないと思います。

private void padTo(List<?> list, int size) { 
    for (int i=list.size(); i<size; i++) 
     list.add(null); 
} 
+3

不要なメモリの再割り当てを避けるために、ループの前に 'list.ensureCapacity(size)'を呼び出すことを検討してください。 – Mersenne

+0

ensureCapacity(size)は実際に配列を埋めていないことに注意してください。 - http://stackoverflow.com/questions/7688151/java-arraylist-ensurecapacity-not-working –

3

代わりにMap<Integer, MyClass>を使用することができます。具体的には、HashMapを使用すると、よりも遅くなりますが、O(1)になります。

1

あなたが規則的に配列したいような音:

  • をあなたは、あなたは間違いなくリストではなくマップを使用する必要がある場合、いくつかの大きなサイズに
+0

ArrayListのサイズを指定できます – blank

+3

そうは思わないです。これは初期割り当て容量ですが、サイズは開始時にゼロです。 – pitosalas

+0

通常の配列は、リストに格納されている項目が総称である場合はオプションではありません。 –

1

を指定するランダムアクセス

  • をしたいですarraylistのaddメソッドとsetメソッドをオーバーライドして最初にインデックスにnullを入れるのが最善です。他の良い方法はありませんIMO

  • 3

    を使用できTreeMap<key, value>valueにより自然な順序でソートされています。ただ、このようなユーティリティは、あなたがそれを必要とするあなたはどこにでもループを繰り返すのではなく、何度も繰り返し使用することができ、そのための機能、何かを書きます。

    ここでは、インデックスとして価値を保持することができます。任意の値を挿入することができ、順序通りである必要はありません。これは最も簡単な解決策です。

    +0

    これに関するさらに詳しい情報:https://github.com/ google/guava/wiki/UsingAndAvoidingNullExplained#specific-cases – Yar

    1

    ハッシュマップはおそらくあなたが考えるよりもはるかに非効率的です。試してみてください。それ以外の場合は、ヌルをループして塗りつぶすよりも、よりエレガントに行う方法はないと思います。あなたは少なくとも博覧会のエレガンスを望むなら、ArrayListをサブクラス化し、すべてのループなどを隠すexpandedSet(position、value)メソッドを追加することができます。おそらく、これはオプションではない?もしそれ以外のユーティリティメソッドを持っていないのであれば、これは素晴らしいimhoではありませんが、他のタイプのリストでもうまくいくと思います。

    おそらく、ラッパークラスは、両方の世界の最高のだろうか、(指標のほとんどが空になります)スパース配列を探しているなら、おそらくそれだけで不要なオーバーヘッド...

    0

    を被ります、何らかの種類の地図(たぶんHashMap)があなたの最善の策になるでしょう。どの配列エスクの解決策でも、すべての空のインデックスのためにスペースを確保する必要があります。スペースはそれほど効率的ではなく、HashMapはほとんどの通常の目的には十分に高速です。

    最終的にいくつかのnまで配列を埋める場合は、必要なインデックスに到達するためにループ内にヌルを追加する必要があります。最終的に保存したい要素数の初期容量を与えることで、これをやや効率的にすることができます(これにより、ArrayList自体のサイズ変更が不要になります)。 new ArrayList(n)は正常に動作します。残念ながら、それを作るときにループに物を追加することを除いて、まずそれを一定のサイズにする簡単な方法はありません。

    +0

    私はそれが 'サイズ'ではなく '容量'を設定すると信じています – pitosalas

    +0

    @pitosalasいいキャッチです。今すぐ修正する。 – Retief

    関連する問題