java: ArrayList - Wie kann ich überprüfen, ob ein Index vorhanden ist?

111

Ich verwende ArrayList<String>und füge Daten zu bestimmten Indizes hinzu. Wie kann ich überprüfen, ob ein bestimmter Index vorhanden ist?

Soll ich einfach get()und den Wert überprüfen? Oder soll ich auf eine Ausnahme warten? Gibt es eine andere Art und Weise?

Aktualisieren

Vielen Dank für Ihre Antworten, aber da ich nur bestimmte Indizes hinzufüge, zeigt mir die Länge der Liste nicht, welche verfügbar sind.

ufk
quelle
2
Schauen Sie sich ein Set an, das vielleicht besser zu Ihren Anforderungen passt?
Paul Whelan
3
Dann wirst du haben get()und prüfen , ob null- verlassen Sie sich nicht auf Ausnahmen though. ErwägenHashTable
Sie
genial!! Ich werde HashTable verwenden, danke
ufk

Antworten:

157

Die Methode arrayList.size() gibt die Anzahl der Elemente in der Liste zurück. Wenn der Index also größer oder gleich dem ist size(), ist er nicht vorhanden.

if(index >= myList.size()){
  //index not exists
}else{
 // index exists
}
Amarghosh
quelle
10
Das sollte "größer oder gleich size()" sein, da es sich um einen auf Null basierenden Index handelt.
McDowell
1
Erwähnenswert ist auch, dass Sie, um dieses Atom zu erstellen, wahrscheinlich die size () - Prüfung und die entsprechende Suche auf der Basis eines bedingten Index durchführen sollten, während Sie die Liste sperren.
Adamski
3
Bitte beachten Sie, dass ich diese Antwort als richtig markiere, weil der Eigentümer (Amarghosh) meine Frage in einem Kommentar zu meiner Frage beantwortet hat. HashTable wird meinen Bedürfnissen viel besser entsprechen.
Ufk
Was ist, wenn Sie Elemente in der Arrayliste mit der ID des Elements festlegen? Ex. mylist.set (1, item1); mylist.set (3, item3); // 2 überspringen Ich denke, HashMap ist besser für dieses Szenario geeignet?
Yeahman
Das befriedigt mich nicht ganz. Wenn ich etwas in der Liste tun möchte, wenn der Index bereits vorhanden ist, aber ansonsten, um ihn vorzubereiten. Mit einer neuen Liste, bei der ich anfangen werde, index = 0und meiner list.size() == 0auch. Wenn ich das erste Mal nachschaue, wird es wahr sein und ich werde die Liste vorbereiten, um Dinge zu tun. Aber das nächste Mal bei diesem Index bleibt mein Index erhalten, index = 0und jetzt initialisiere ich das Element in der Liste neu, als ich eigentlich etwas tun sollte. Der erste Gedanke ist zu &&einer zweiten Bedingung wie, list.get(index) == nullaber dass nicht funktioniert, ist, warum es Fragen wie diese gibt
Roberto Tomás
68

Während Sie ein Dutzend Vorschläge zur Verwendung der Größe Ihrer Liste erhalten haben, die für Listen mit linearen Einträgen funktionieren, schien niemand Ihre Frage zu lesen.

Wenn Sie Einträge manuell an verschiedenen Indizes hinzufügen, funktioniert keiner dieser Vorschläge, da Sie nach einem bestimmten Index suchen müssen.

Die Verwendung von if (list.get (index) == null) funktioniert ebenfalls nicht, da get () eine Ausnahme auslöst , anstatt null zurückzugeben.

Versuche dies:

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

Hier wird ein neuer Eintrag hinzugefügt, wenn der Index nicht existiert. Sie können es ändern, um etwas anderes zu tun.

pli
quelle
2
Vielen Dank, brauchte diese Technik für Unit-Tests, ob Array-Indizes existieren.
Noumenon
11
Denken Sie daran, die Verwendung try/catchfür diese Art von Arbeit zu vermeiden. Dadurch wird Ihr Programm um 50% oder mehr verlangsamt. Die Fehlerprüfung fügt Ihrem vorhandenen Code wie ein Gurt hinzu, um ihn zu verlangsamen. Besser, um ihn in kritischen Bereichen zu vermeiden. Prüfen auf lengthin diesem Fall ist das Beste , was man tun kann, da die indeximmer geringer sein wird dann die length, alte index'wird s verschoben erhalten und neu geworden indexist , wenn Sie removesie also, warum die Regelprüfung für lengthimmer funktionieren wird.
SSpoke
1
@SSpoke ... Obwohl ich damit einverstanden bin, ist try / catch alles andere als eine gute Antwort. Das Problem wird behoben, wenn die Liste spärlich ist. Ich bevorzuge den Vorschlag, ein Array zu verwenden: Object [] ary; unten oder ein Hash.
wird
12

Das brauchen Sie ...

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

Warum nicht ein einfaches altes Array verwenden? Der indizierte Zugriff auf eine Liste ist meiner Meinung nach ein Codegeruch.

Paul McKenzie
quelle
3
Nicht immer, da er möglicherweise möchte, dass die ArrayList mit der Zeit wächst und ein Array dies nicht kann.
Coyote21
7

Normalerweise überprüfe ich nur, ob der Index kleiner als die Arraygröße ist

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

Wenn Sie auch befürchten, dass der Index ein negativer Wert ist, verwenden Sie Folgendes

if (index >= 0 && index < list.size()) {
    ...
}
AamirR
quelle
1
Wie liefert dies einen Wert gegenüber der akzeptierten Antwort von vor einigen Jahren?
Basil Bourque
2
Ich denke, Ihrer Ansicht nach liefert es keinen Wert, aber ich habe einen Kommentar von Roberto Tomás zu der akzeptierten Antwort gesehen, vorausgesetzt, er hat die akzeptierte Antwort nicht ganz verstanden. check it out "Mit einer neuen Liste beginne ich bei index = 0 und my list.size () == 0. Auch wenn ich es zum ersten Mal überprüfe, ist es wahr" Ich habe beschlossen, eine separate Antwort zu posten, um zu helfen jede zukünftige Verwirrung.
AamirR
6

In Bezug auf Ihr Update (was wahrscheinlich eine andere Frage sein sollte). Sie sollten ein Array dieser Objekte anstelle einer ArrayList verwenden, damit Sie den Wert einfach auf null überprüfen können:

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

Beste Übung

Wenn Sie nicht Hunderte von Einträgen in Ihrem Array haben, sollten Sie es als Klasse organisieren, um die magischen Zahlen 3,8 usw. loszuwerden.

Der Kontrollfluss mit Ausnahme ist eine schlechte Praxis.

Stapler
quelle
1
Wenn Array [8] nicht vorhanden ist, tritt ArrayIndexOutOfBoundException auf.
Nitesh Kumar Anand
4

Da java-9es eine Standardmethode gibt, um zu überprüfen, ob ein Index zum Array gehört - 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
Anton Balaniuc
quelle
of()Methode auch in hinzugefügt wird Java 9 zur Klasse Liste : docs.oracle.com/javase/9/docs/api/java/util/List.html#of--
Orici
3

Sie können die Größe eines ArrayListmit der size()Methode überprüfen . Dies gibt den maximalen Index +1 zurück

Jwoolard
quelle
2

ein einfacher Weg, dies zu tun:

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

Schneller und schmutziger Test, ob ein Index vorhanden ist oder nicht. in Ihrer Implementierung Liste ersetzen Mit Ihrer Liste testen Sie.

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

oder für zweidimensionale ArrayLists ...

public boolean hasRow(int row){
    if(row < _matrix.size())
        return true;
    return false;
}
t3dodson
quelle
1
Liste hat nicht .lengthhat , list.size()aber es ist keine große Sache , ich mag diese ganze Zeit vermassele haha ich auf Compiler angewiesen , mich zu führen , dass man auf. Sie haben wahrscheinlich an primitive Arrays
gedacht
1
Danke, dass du das verstanden hast. Die Kardinalität der Container kann leicht vergessen werden.
t3dodson
0

Wenn Ihr Index kleiner als die Größe Ihrer Liste ist, existiert er möglicherweise mit nullWert. Wenn der Index größer ist, können Sie aufrufen ensureCapacity() , um diesen Index verwenden zu können.

Wenn Sie überprüfen möchten, ob ein Wert in Ihrem Index vorhanden ist nulloder nicht, rufen Sie anget()

Dmitry
quelle
1
Durch Aufrufen von sureCapacity (int) wird die Liste nicht vergrößert, sondern nur die Kapazität. dh "potenzielle Größe", so dass Indexsuchen außerhalb der Grenzen immer noch fehlschlagen würden.
Adamski
Warum sollten Sie außerdem sureCapacity (int) überhaupt aufrufen? Es könnte eine unglaublich teure Operation sein, wenn beispielsweise die aktuelle Größe der Liste 5 beträgt und Sie den Wert von Artikel-Nr.: 100.000.000 bestimmen möchten.
Adamski
Ich meinte, dass Indizes kleiner als size () immer existieren, solche, die> = size () sind, nicht und man kann sie nicht verwenden (== call set ()), bis die Liste groß genug wird. Das Aufrufen von sureCapacity reicht in der Tat nicht aus, man muss die Größe durch Hinzufügen von Elementen ändern.
Dmitry
Falsche Erklärung darüber, was sureCapacity (int) tatsächlich tut. Mit der ArrayList-Größe wird nichts unternommen.
Mohsen
0

Sie können die Größe des Arrays überprüfen.

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'
    }
}
miku
quelle