5

現在、ArrayList を使用して要素のリストを格納しているため、特定の位置に新しい要素を挿入する必要があります。現在のサイズよりも大きい位置に要素を入力する必要があります。例:

ArrayList<String> arr = new ArrayList<String>();
arr.add(3,"hi");

OutOfBoundsException が発生することはすでにわかっています。注文を維持しながらこれを行うことができる別の方法または別のオブジェクトはありますか? これは、インデックスに基づいて要素を検索するメソッドがあるためです。例:

ArrayList<String> arr = new ArrayList<String>();
arr.add("hi");
arr.add(0,"hello");

インデックス 0 ではなく、インデックス 1 で「こんにちは」が見つかるはずです。
要約すると、間にある要素に null を手動で挿入する以外に、これら 2 つの要件を満たす方法はありますか。

  • 現在のサイズよりも大きい位置に要素を挿入する
  • リストの途中に要素を挿入すると、既存の要素が右に押し出される

Java ArrayList add item outside current sizeと HashMapを見てきましたが、HashMap は 2 番目の基準を満たしていません。どんな助けでも大歓迎です。

PS のパフォーマンスは、現時点では特に問題ではありません。

更新:なぜこれらの特定の要件があるのか​​ についていくつかの質問がありました。これは、一連の操作をリスト(数式)に挿入する操作の変換に取り組んでいるためです。各操作には文字列が含まれます。リストに文字列を挿入/削除すると、既に適用されている各操作の追跡を通じて、(必要に応じて) 適用されていない操作が動的に更新されます。私の現在の解決策は、ArrayList のサブクラスを使用し、いくつかのメソッドをオーバーライドすることです。ただし、よりエレガントな方法があるかどうかは確かに知りたいです。

4

5 に答える 5

7

あなたの要件は矛盾しています:

... 特定の位置に新しい要素を挿入する必要があります。

現在のサイズよりも大きい位置に要素を入力する必要があります。

これらは、ポジションが安定していることを意味します。つまり、特定の位置にある要素はその位置にとどまります。

インデックス 0 ではなく、インデックス 1 で「こんにちは」が見つかるはずです。

これは、状況によってはポジションが安定しないことを示しています。

必要な代替手段を決定する必要があります。

  • 安定した位置が必要な場合は、TreeMapまたはを使用しHashMapます。(ATreeMapを使用すると、キーを順番に繰り返すことができますが、大きなコレクションの場合、挿入と検索のコストが高くなります。) 必要に応じて、新しいキーを「常に」生成できる「位置」キー タイプを使用します。既存のキーのペアの間にあるキー。

  • 安定した位置を持つ必要がない場合は を使用しArrayList、 を使用して終了位置を超えて挿入する必要がある場合に対処しますappend

端を超えて挿入すると位置が安定し、途中で挿入すると不安定になることがどのように賢明であるかがわかりません。(しかも、後者はいずれ前者を不安定にしてしまう…)

于 2012-05-17T04:41:59.457 に答える
3

キーの順序を維持するために TreeMap を使用することもできます。

于 2012-05-17T04:29:33.360 に答える
2

何よりもまず、Mapリストの代わりに使用することをお勧めします。を使用すると、問題をより良い方法で解決できると思いますMap。しかし、いずれにせよ、本当にこれをやりたいのであればArraylist

        ArrayList<String> a = new ArrayList<String>(); //Create empty list
        a.addAll(Arrays.asList( new String[100]));  // add n number of strings, actually null . here n is 100, but you will have to decide the ideal value of this, depending upon your requirement.
        a.add(7,"hello");
        a.add(2,"hi");
        a.add(1,"hi2");
于 2012-05-17T04:41:09.317 に答える