指定されたインデックスでArrayListにオブジェクトを追加します


142

かなり簡単な質問だと思いますが、これを正しく行う方法がわかりません。

空の配列リストがあります:

ArrayList<object> list = new ArrayList<object>();

追加したいオブジェクトがいくつかあり、各オブジェクトは特定の位置にある必要があります。ただし、それらは可能な各順序で追加できる必要があります。これを試しても機能しませんIndexOutOfBoundsException

list.add(1, object1)
list.add(3, object3)
list.add(2, object2)

私が試したのは ArrayListnull、その後、上記をやって。機能しますが、恐ろしい解決策だと思います。これを行う別の方法はありますか?


7
リストが空で、存在しないリストの位置にアクセスできないため、IndexOutOfBoundsExceptionが発生します...
Vic

1
リストにnullオブジェクトを入力せずにその位置を作成する方法はありますか?私にはそれは本当に奇妙な解決策のようです。
J. Maes

1
私はそうは思いません...ランダムな順序でオブジェクトを追加する必要がある場合は、それを行う別の方法を探す必要があります。たとえば、典型的な配列: 'Object []'の場合、入力する必要はありません。初期化するだけです
Vic

1
@Maethortjeそれは本当に奇妙な問題ではありません。疎なリストを参照してください。reference.wolfram.com/ mathematica / tutorial /…は良い記事のようです。ただし、Javaでは、キーとしてインデックスを使用するマップが最も簡単なアプローチかもしれません。
惨めな変数

2
@Panあなたがサイズを宣言したとしても..それは単にリストを初期化するのではなく、メモリに予約したいスペースの数を宣言します..私がそれを見るとわかるように、リストは要素へのポインタを持つ要素の配列です次の要素。2番目が空(またはnull)のときに3番目の位置に要素を追加しようとすると、3番目の要素であることを示すポインタがありません。:1-> 2-> 3はOKですが、1- > *-> 3ここに問題があります...
Vic

回答:


209

あなたはこのようにそれを行うことができます:

list.add(1, object1)
list.add(2, object3)
list.add(2, object2)

object2を位置2に追加すると、object3が位置3に移動します。

object3を常にposition3に配置したい場合は、位置としてキー、オブジェクトとして値を持つHas​​hMapを使用することをお勧めします。


3
ハッシュマップは確かにこの問題を解決することができます。私は、場所2のオブジェクトが存在しないとき、私は私が場所3に何かを追加することができますように、それはいないようですので、その1つのために行くと思う
J.マース

短いがほとんどの回答。他はちょうど間違った軌道に乗っています
Shabbir Dhangot 2015

建設的なロジック!
Arsal Imam

31

オブジェクトの配列を使用してArrayList-に変換できます

Object[] array= new Object[10];
array[0]="1";
array[3]= "3";
array[2]="2";
array[7]="7";

List<Object> list= Arrays.asList(array);

ArrayListは次のようになります-[1、null、2、3、null、null、null、7、null、null]


2
1つの欠点は、事前にサイズを知っておく必要があることです。
DanielHári2017

17

その場合は、通常の配列の使用を検討して、容量を初期化し、必要なインデックスにオブジェクトを配置してください。

Object[] list = new Object[10];

list[0] = object1;
list[2] = object3;
list[1] = object2;

容量を初期化しますが、「ArrayList」のサイズは初期化しません。サイズは要素の数として定義され、インデックスが>サイズの場合、例外が発生します...
Vic

@Vic、私は最初に質問を読み間違えましたが、ヒントをありがとう。
medopal 2011

容量を10に初期化しましたが、オブジェクトを追加するときにもIndexOutOfBoundsExceptopnを取得します。EnsureCapacityで容量を変更する場合も同様です。作品は...現時点ではヌルを充填されていることを唯一のもの
J.マース

@Maethortje「サイズ」と「容量」の違いを探す...例外は、インデックスが>サイズのときではなく、容量> ....のときではありません
Vic

連中が述べたように、リストのサイズがまだ1であるのに、オブジェクトをインデックス3に追加しています。それは不可能です。このインデックスは、例えば、リストの境界の内側にあるように、特定のインデックスに追加するには、あなたのリストには、3つのオブジェクトがある場合、あなたはインデックス100でオブジェクトを追加することはできません限り許可されている
medopal

14

ArrayListをオーバーライドして、サイズと追加する要素の間にnullを挿入することもできます。

import java.util.ArrayList;


public class ArrayListAnySize<E> extends ArrayList<E>{
    @Override
    public void add(int index, E element){
        if(index >= 0 && index <= size()){
            super.add(index, element);
            return;
        }
        int insertNulls = index - size();
        for(int i = 0; i < insertNulls; i++){
            super.add(null);
        }
        super.add(element);
    }
}

その後、ArrayListの任意の時点で追加できます。たとえば、このメインメソッド:

public static void main(String[] args){
    ArrayListAnySize<String> a = new ArrayListAnySize<>();
    a.add("zero");
    a.add("one");
    a.add("two");
    a.add(5,"five");
    for(int i = 0; i < a.size(); i++){
        System.out.println(i+": "+a.get(i));
    }
}   

コンソールからこの結果が得られます:

0:ゼロ

1:1

2:2

3:null

4:null

5:5


9

インデックスが範囲外の場合(スローされるとArrayList.add記載されているドキュメントに 注意を向けIndexOutOfBoundsExceptionます(index < 0 || index > size()

size()電話をかける前にリストを確認してくださいlist.add(1, object1)


あなたは正しい@ Hemal、@ Maethortje要素をリストに追加する前に、リストのサイズを確認してみませんか?追加しようとしている位置がリストのサイズよりも小さいかどうかを確認します。そうでない場合は、通常どおり実行できますlist.add("element");
Rakesh

1
私が理解しているように、「問題」は、位置2に要素がない場合でも、位置3に要素を追加することです...
Vic

スパースリストである@Vis-質問に対する私のコメントを参照してください。
惨めな変数

5

空のインデックスにnullを設定する必要があります。

while (arraylist.size() < position)
{
     arraylist.add(null);
}

arraylist.add(position, object);

2
@Maethortje 

The problem here is java creates an empty list when you called new ArrayList and 

指定された位置に要素を追加しようとしているときにIndexOutOfBoundを取得したため、リストの位置に要素がいくつかあるはずです。

以下をお試しください

/*
  Add an element to specified index of Java ArrayList Example
  This Java Example shows how to add an element at specified index of java
  ArrayList object using add method.
*/

import java.util.ArrayList;

public class AddElementToSpecifiedIndexArrayListExample {

  public static void main(String[] args) {
    //create an ArrayList object
    ArrayList arrayList = new ArrayList();

    //Add elements to Arraylist
    arrayList.add("1");
    arrayList.add("2");
    arrayList.add("3");

    /*
      To add an element at the specified index of ArrayList use
      void add(int index, Object obj) method.
      This method inserts the specified element at the specified index in the
      ArrayList.  
    */
    arrayList.add(1,"INSERTED ELEMENT");

    /*
      Please note that add method DOES NOT overwrites the element previously
      at the specified index in the list. It shifts the elements to right side
      and increasing the list size by 1.
    */

    System.out.println("ArrayList contains...");
    //display elements of ArrayList
    for(int index=0; index < arrayList.size(); index++)
      System.out.println(arrayList.get(index));

  }
}

/*
Output would be
ArrayList contains...
1
INSERTED ELEMENT
2
3

*/

エラーの原因となっている問題を理解しています。オブジェクトをその位置に追加する前に、オブジェクトを後続の位置に追加する必要があるようです。追加する瞬間、追加するすべてのオブジェクトを破棄するわけではありません。nullオブジェクトを追加することが適切な解決策だと思いますか?
J. Maes

@Maethortjeハックなので、これを行うのは公平ではありません:)
Sankalp

最初の段落からコードサンプルの引用符を削除する必要があります。
Jalal Sordo 2013年

2

whileソリューションとしてこの小さなループはどうですか?

private ArrayList<Object> list = new ArrayList<Object>();

private void addObject(int i, Object object) {
    while(list.size() < i) {
        list.add(list.size(), null);
    }
    list.add(i, object);
}
....

addObject(1, object1)
addObject(3, object3)
addObject(2, object2)


1

medopalのソリューションはあなたが探しているものだと思います。

しかし、もう1つの代替ソリューションは、HashMapを使用し、キー(整数)を使用して位置を格納することです。

この方法では、最初にnullなどを設定する必要はありません。移動するときに、マップ内の位置とオブジェクトを貼り付けます。必要に応じて、最後に数行を記述してリストに変換できます。


キーで順序付けされているため、TreeMapの方が優れていますか?
DanielHári2017

1

ある位置にアイテムを追加する場合、リストのサイズはその位置より大きくなければなりません。

add(2, item):この構文は、位置2の古いアイテムを次のインデックスに移動し、2番目の位置にアイテムを追加することを意味します。

2番目の位置にアイテムがない場合、これは機能せず、例外がスローされます。

つまり何かを追加したい場合position 2,

あなたのリストのサイズ、少なくともでなければならない(2 + 1) =3,項目がでご利用いただけますので、0,1,2 Position.

このようにして、位置2が安全にアクセスされ、例外がないことが保証されます。


2
私はあなたの答えを通知したときにちょうど通り過ぎています...実際には、インデックスは、新しいアイテムを挿入するときのリストの実際の長さ以下でなければなりません。例:リストのサイズは2です。インデックス2に追加すると機能します。インデックス3に追加すると、例外がスローされます。(テスト済み)
Houssem Chlegou

0

JavaのAndroidフレーバーを使用している場合は、SparseArrayの使用をお勧めします。それはマップより整数のオブジェクトへのよりメモリ効率の良いマッピングであり、反復するのが簡単です


0

少し遅くなりますが、うまくいけばまだ誰かに役立つでしょう。

アイテムを特定の位置に追加する2つのステップ ArrayList

  1. add の特定のインデックスへのnullアイテム ArrayList
  2. 次にset、必要に応じた位置。

        list = new ArrayList();//Initialise the ArrayList
    for (Integer i = 0; i < mItems.size(); i++) {
        list.add(i, null); //"Add" all positions to null
    }
       // "Set" Items
        list.set(position, SomeObject);

このようにして、ArrayListつまり、次のようなアイテムを追加する場合に、冗長なアイテムがなくなります。

list = new ArrayList(mItems.size());    
list.add(position, SomeObject);

これは既存の項目を単にその位置で上書きするのではなく、既存の項目を1つ右にシフトするため、2倍の数のインデックスを持つArrayListがあります。


0

インデックスで既存の値を置き換えるには、追加する代わりに設定する必要があります。

list.add(1, object1)
list.add(2, object3)
list.set(2, object2)

リストには[object1、object2]が含まれます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.