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.


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
}

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.


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.


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()) {
    ...
}

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.


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


3

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


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.
  }
}

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

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


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'
    }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.