web-dev-qa-db-ja.com

インデックスでArrayListに追加するときにIndexOutOfBoundsException

例外Exception in thread "main" Java.lang.IndexOutOfBoundsException: Index: 1, Size: 0以下のコードの場合。しかし、その理由は理解できませんでした。

public class App {
    public static void main(String[] args) {
        ArrayList<String> s = new ArrayList<>();

        //Set index deliberately as 1 (not zero)
        s.add(1,"Elephant");

        System.out.println(s.size());                
    }
}

更新

私はそれを動作させることができますが、概念を理解しようとしているので、宣言を以下に変更しましたが、どちらも動作しませんでした。

ArrayList<String> s = new ArrayList<>(10)
10
Bala

ArrayListインデックスは0(ゼロ)から始まります

配列リストのサイズが0で、最初のインデックスに文字列要素を追加しています。 0番目のインデックスに要素を追加しないと、次のインデックス位置を追加できません。それは間違っています。

だから、単純に

 s.add("Elephant");

またはできる

s.add(0,"Elephant");

ArrayListに要素を0、1などから順番に追加する必要があります。

要素を特定の位置に追加する必要がある場合は、以下を実行できます-

String[] strings = new String[5];
strings[1] = "Elephant";

List<String> s = Arrays.asList(strings);
System.out.println(s); 

これにより、次のような出力が生成されます。

[null, Elephant, null, null, null]
6
Sohail

ArrayListは空です。この行で:

s.add(1,"Elephant");

追加しようとしています"Elephant"インデックス1ArrayList(2番目の位置)は存在しないため、IndexOutOfBoundsExceptionをスローします。

使用する

s.add("Elephant");

代わりに。

5
BackSlash

Androidの場合:

ギャップが多いリストを使用する必要がある場合は、メモリの観点から SparseArray を使用することをお勧めします(ArrayListは、 nullエントリ)。

使用例:

_SparseArray<String> list = new SparseArray<>();
list.put(99, "string1");
list.put(23, "string2");
list.put(45, "string3");
_
  • 1、2、3、5、7、11、13などの連続したキーを追加する場合は、list.append()を使用します...
  • 100、23、45、277、42などの非順次キーを追加する場合は、list.put()を使用します。

リストで数百を超えるアイテムを使用する場合は、 HashMap を使用することをお勧めします。これは、ルックアップではバイナリ検索が必要であり、追加と削除では配列へのエントリの挿入と削除が必要になるためです。

1
David Miguel

add(int index, E element) APIによると、配列リストのサイズはゼロであり、要素を最初のインデックスに追加しています

スロー:

_IndexOutOfBoundsException - if the index is out of range (index < 0 || index > size())
_

代わりに boolean add(E e) を使用してください。

[〜#〜] update [〜#〜]質問の更新に基づいて

私はそれを動作させることができますが、概念を理解しようとしているので、宣言を以下に変更しましたが、どちらも動作しませんでした。

_ArrayList<String> s = new ArrayList<>(10)
_

new ArrayList<Integer>(10)を呼び出すと、リストの初期容量がサイズではなく10に設定されます。つまり、この方法で作成された配列リストは空の状態で始まります。

1

次のようにして、ArrayListのサイズ(容量ではない)を初期化できます。

ArrayList<T> list = new ArrayList<T>(Arrays.asList(new T[size]));

あなたの場合:

ArrayList<String> s = new ArrayList<String>(Arrays.asList(new String[10]));

これにより、10個のnull要素を持つArrayListが作成されるため、サイズ(インデックス0〜9)内でランダムな順序で要素を追加できます。

1
Bruno F

インデックス1に「象」が本当に必要な場合は、インデックス0に別の(nullなど)エントリを追加できます。

public class App {
public static void main(String[] args) {
    ArrayList<String> s = new ArrayList<>();

    s.add(null);
    s.add("Elephant");

    System.out.println(s.size());                
  }
}

または、呼び出しを.addに変更して、インデックス0にnullを指定し、インデックス1に象を指定します。

1
jedison

リストにインデックスを直接1として追加しないでくださいリストに値を追加する場合は、次のように追加しますs.add( "Elephant");デフォルトのリストサイズは0です。リストに要素を追加すると、サイズが自動的に増加し、リストの最初のインデックスに直接追加することはできません。 //s.add(0、 "Elephant");

0
veeru

ArrayListは自己拡張可能ではありません。インデックス1にアイテムを追加するには、要素#0が必要です。

0
Denis Kulagin