web-dev-qa-db-ja.com

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

それはかなり単純な質問だと思いますが、これを正しく行う方法を私は理解できません。

空のアレイリストがあります。

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

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

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

私が試したのはArrayListnullで埋めてから上記のようにすることです。それは動作しますが、私はそれが恐ろしい解決策だと思います。これを行う別の方法はありますか?

130
J. Maes

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

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

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

Object3を常にposition3にしたい場合は、positionをキーとして、objectを値として持つHas​​hMapを使用することをお勧めします。

194
superM

あなたはオブジェクトの配列を使用して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]になります。

27
user3484940

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

Object[] list = new Object[10];

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

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分

13

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

size()を呼び出す前に、リストのlist.add(1, object1)を確認してください。

9

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

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

arraylist.add(position, object);
5
Miika Pakarinen
@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

*/
2
Sankalp

解決策として、この小さな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)
2
Stewart

これは可能な解決策です:

list.add(list.size(), new Object());
2
Darius

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

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

2番目の位置に項目がない場合、これは機能しません。それは例外をスローします。

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

あなたのリストサイズは少なくとも(2 + 1) =3,である必要がありますのでアイテムは0,1,2 Position.で利用可能です

そのようにして、ポジション2が安全にアクセスされ、例外がないことが保証されます。

私はmedopalからの解決策があなたが探しているものであると思います。

しかし、もう1つの解決策は、HashMapを使用し、位置を格納するためにキー(Integer)を使用することです。

こうすれば、最初にnullなどを入力する必要がなくなり、移動するときに位置とオブジェクトをマップに貼り付けるだけで済みます。あなたがそのようにそれをそれを必要とするならば、あなたはそれをリストに変換するために最後に数行を書くことができます。

1
Ashkan Aryan

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

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

  1. addname__内の特定の索引に対するArrayListname__ヌル項目
  2. 次に、必要に応じてsetname__の位置を指定します。

        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);
    

このように、あなたはArrayListname__の中に冗長な項目を持っていません。

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

これはその位置にある既存の項目を単に上書きして、既存の項目を1つずつ右にずらすことはないので、ArrayListには2倍の数の標識があります。

0
Zain

あなたがJavaのAndroidフレーバーを使っているなら、私は SparseArray を使うことを提案するかもしれません。これは、マップよりもメモリの効率的な整数のオブジェクトへのマッピングであり、繰り返し処理が簡単です。

0
AllDayAmazing

あなたはindexで既存の値を置き換えるためにaddの代わりに設定するべきです。

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

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

0
Saurabh