web-dev-qa-db-ja.com

java:ArrayList-インデックスが存在するかどうかを確認するにはどうすればよいですか?

ArrayList<String>を使用していますが、特定のインデックスにデータを追加していますが、特定のインデックスが存在するかどうかを確認するにはどうすればよいですか?

単にget()して値を確認する必要がありますか?または、例外を待つ必要がありますか?別の方法はありますか?

更新

ご回答いただきありがとうございますが、特定のインデックスでのみ追加しているため、リストの長さには使用可能なものが表示されません。

91
ufk

メソッドarrayList.size()returns リスト内のアイテム数-インデックスがsize()以上の場合、存在しません。

if(index >= myList.size()){
  //index not exists
}else{
 // index exists
}
132
Amarghosh

リストのサイズの使用に関する多数の提案がありましたが、これは線形エントリを持つリストで機能しますが、誰もあなたの質問を読んでいないようです。

異なるインデックスで手動でエントリを追加する場合、特定のインデックスを確認する必要があるため、これらの提案はいずれも機能しません。

if(list.get(index null))==を使用しても機能しません。get()はnullを返す代わりに例外をスローするからです。

これを試して:

try {
    list.get( index );
} catch ( IndexOutOfBoundsException e ) {
    list.add( index, new Object() );
}

インデックスが存在しない場合、新しいエントリが追加されます。これを変更して、別のことを行うことができます。

65
pli

これはあなたが必要なものです...

public boolean indexExists(final List list, final int index) {
    return index >= 0 && index < list.size();
}

なぜ普通の古い配列を使用しないのですか?リストへのインデックス付きアクセスは、コードの匂いだと思います。

12
Paul McKenzie

アップデートについて(これはおそらく別の質問でしょう)。 ArrayListではなく、これらのオブジェクトの配列を使用する必要があります。そのため、nullの値を簡単に確認できます。

Object[] array = new Object[MAX_ENTRIES];
..
if ( array[ 8 ] == null ) {
   // not available
}
else {
   // do something
}

ベストプラクティス

配列に数百のエントリがない場合は、マジックナンバー3,8などを削除するためのクラスとして整理することを検討してください。

例外を使用した制御フローは悪い習慣です。

6
stacker

通常、インデックスが配列サイズよりも小さいかどうかを確認します

if (index < list.size()) {
    ...
}

インデックスが負の値であることも懸念される場合は、次を使用します

if (index >= 0 && index < list.size()) {
    ...
}
5
AamirR

size()メソッドを使用して、ArrayListのサイズを確認できます。これにより、最大インデックス+1が返されます

3
jwoolard

Java-9以降、インデックスが配列に属しているかどうかを確認する標準的な方法があります- Objects#checkIndex()

List<Integer> ints = List.of(1,2,3);
System.out.println(Objects.checkIndex(1,ints.size())); // 1
System.out.println(Objects.checkIndex(10,ints.size())); //IndexOutOfBoundsException
3
Anton Balaniuc

インデックスが存在するかどうかの迅速でダーティなテスト。実装内の置換リストテストしているリストに置き換えます。

public boolean hasIndex(int index){
    if(index < list.size())
        return true;
    return false;
}

または2次元配列リストの場合...

public boolean hasRow(int row){
    if(row < _matrix.size())
        return true;
    return false;
}
1
t3dodson

これを行う簡単な方法:

try {
  list.get( index ); 
} 
catch ( IndexOutOfBoundsException e ) {
  if(list.isEmpty() || index >= list.size()){
    // Adding new item to list.
  }
}
0
Josué

インデックスがリストのサイズよりも小さい場合は、おそらくnull値を使用して存在します。インデックスが大きい場合は、ensureCapacity()を呼び出してそのインデックスを使用できます。

インデックスの値がnullかどうかを確認する場合は、get()を呼び出します

0
Dmitry

配列のサイズを確認できます。

package sojava;
import Java.util.ArrayList;

public class Main {
    public static Object get(ArrayList list, int index) {
        if (list.size() > index) { return list.get(index); }
        return null;
    }

    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add(""); list.add(""); list.add("");        
        System.out.println(get(list, 4));
        // prints 'null'
    }
}
0
miku