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


111

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

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

更新

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


2
必要なものにおそらくより適しているセットを見てください。
Paul Whelan、

3
次にget()、確認するnull必要があります-例外に依存しないでください。HashTable代わりにjava.sun.com/j2se/1.4.2/docs/api/java/util/Hashtable.html
Amarghosh

驚くばかり!!私はHashTableの感謝を使用します
ufk '25年

回答:


158

このメソッドarrayList.size() リスト内のアイテムの数を返します。したがって、インデックスがと等しいかそれよりも大きい場合、そのインデックスはsize()存在しません。

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

10
これはsize()ゼロベースのインデックスであるため、「以上」である必要があります。
McDowell

1
このアトミックを作成するには、リストをロックしながら、おそらくsize()チェックと対応する条件付きインデックスベースのルックアップを実行する必要があることにも言及する価値があります。
アダムスキー、2010年

3
この回答に正しいマークを付けているのは、所有者(Amarghosh)が私の質問へのコメントで私の質問に回答したためです。HashTableは私のニーズにはるかによく適合します。
ufk

アイテムのIDでarraylistにアイテムを設定している場合はどうなりますか?例 mylist.set(1、item1); mylist.set(3、item3); //スキップ2 HashMapがそのシナリオに適していると思いますか?
イェーマン

これは私を完全に満足させません..インデックスが既にそこにある場合にリストで何かをしたいのであれば、それ以外の場合はそれを準備するために..新しいリストindex = 0で私list.size() == 0も始めます。だから、最初にチェックしたときは真実であり、リストを準備してやることにします。しかし、次回そのインデックスで、私のインデックスはまだ残ります。index = 0今、私は何かをすることになっていたときに、リスト内のその要素を再初期化しています。最初の考えは&&次のような2番目の条件に対するものですlist.get(index) == nullが、機能しないことがこのような質問がある理由です
ロベルト・トマス

69

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

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

使い方(list.get(指数)が== null)の場合はどちらか動作しません)(GETとしては、代わりにヌルを返すの例外がスローされます。

これを試して:

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

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


2
ありがとう、配列インデックスが存在するかどうかを単体テストするためにこの手法が必要でした
Noumenon 2013

11
try/catchこの種の作業には使用しないでください。プログラムの速度が50%以上遅くなります。既存のコードにエラーチェックを追加すると、速度が遅くなります。重要な領域では回避することをお勧めします。lengthこの場合のチェックは、あなたができる最善のことです。なぜなら、indexは常により小さいのでlength、古いindexはシフトされ、新しいになるので、常にのルールチェックが機能するのindexremoveそのためですlength
SSpoke、2014

1
@SSpoke ...同意しますが、try / catchは「良い」答えにはほど遠いものです。リストがまばらな場合に問題に対処します。私は配列を使用することをお勧めします:Object [] ary; 以下またはハッシュ。
意志

12

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

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

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


3
必ずしもそうとは限りません。なぜなら、彼はArrayListが時間とともに成長することを望んでいる可能性があるためです。
Coyote21

7

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

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

インデックスが負の値であることも心配な場合は、以下を使用してください

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

1
これは数年前の承認された回答よりもどのように価値を提供しますか?
バジル

2
あなたの考えではそれは価値を提供しないと思いますが、彼が受け入れられた回答を完全に理解していないと仮定して、私は受け入れられた回答に関するロベルト・トマスのコメントを見ました。「新しいリストを使って、index = 0とmy list.size()== 0から開始します。最初に確認したときにtrueになります。」ヘルプ用に別の回答を投稿することにしました将来の混乱。
AamirR 2018年

6

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

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

ベストプラクティス

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

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


1
array [8]が存在しない場合、ArrayIndexOutOfBoundExceptionが発生します。
Nitesh Kumar Anand

4

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

of()メソッドもJava 9 のクラスリストに追加されますdocs.oracle.com/javase/9​​/docs/api/java/util/List.html#of--
Orici

3

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


2

これを行う簡単な方法:

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

1

インデックスが存在するかどうかをすばやく簡単にテストします。あなたの実装であなたのリストであなたがテストしているリストで置き換えます。

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

または2次元のArrayListsの場合...

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

1
リストには.lengthそれがありませんがlist.size()、コンパイラーに頼ってそのガイドを頼りにしています。あなたはおそらくプリミティブ配列を考えていました
SSpoke

1
それをキャッチしてくれてありがとう。コンテナのカーディナリティは忘れがちです。
t3dodson 2014

0

インデックスがリストのサイズよりも小さい場合、存在する可能性がありnullます。インデックスが大きい場合ensureCapacity() 、そのインデックスを使用できるように呼び出すことができます。

インデックスの値がそうであるかどうかを確認したい場合nullは、get()


1
EnsureCapacity(int)を呼び出すと、リストのサイズは増加せず、容量のみが増加します。つまり、「潜在的なサイズ」なので、範囲外のインデックス検索は失敗します。
アダムスキー

また、なぜensureCapacity(int)を呼び出すのですか?たとえば、リストの現在のサイズが5であり、item#の値を決定したい場合、100,000,000となると、非常にコストのかかる操作になる可能性があります。
アダムスキー、2010年

size()よりも小さいインデックスは常に存在し、> = size()のインデックスは存在せず、リストが十分に大きくなるまで、それらを使用できません(== call set())。EnsureCapacityを呼び出すだけでは十分ではありません。要素を追加してサイズを変更する必要があります。
Dmitry

EnsureCapacity(int)が実際に行うことについての誤った説明。ArrayListサイズでは何もしません。
Mohsen、2012

0

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

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