Besserer Weg, um den Index des Elements in ArrayList zu finden?

89

Für eine Android-App habe ich die folgenden Funktionen

private ArrayList<String> _categories; // eg ["horses","camels"[,etc]]

private int getCategoryPos(String category) {
    for(int i = 0; i < this._categories.size(); ++i) {
        if(this._categories.get(i) == category) return i;
    }

    return -1;
}

Ist das der "beste" Weg, eine Funktion zum Abrufen der Position eines Elements zu schreiben? Oder gibt es in Java eine ausgefallene native Shmancy-Funktion, die ich nutzen sollte?

Jacksonkr
quelle
1
Dieser Code ist wahrscheinlich fehlerhaft: Die Verwendung von ==führt in den meisten Fällen zu falschen Ergebnissen.
3
Denken Sie daran, Sie können Strings nicht mit '==' vergleichen, Sie müssen String.equals (String str)
MrZander
5
@ MrZander Sicher können Sie sie vergleichen mit ==... es ist einfach nicht die richtige Art von Vergleich ;-)
Sie können sehen, dass ich noch neu in Java bin. Ist es String.equalseher so, wie ===es in einer Sprache wie JavaScript sein könnte? z.B. prüft gegen Wert UND Typ?
Jacksonkr
3
Nr. == Ist Objektidentität und bedeutet "ist das gleiche Objekt" . (Diese Ansicht gilt sowohl für primitive Werte als auch für Referenztypen, wenn Sie bedenken, dass es nur eine Zahl mit dem Wert 42 oder char 'x' usw. gibt.) Object.equalsist eine virtuelle Methode, die für alle Objektinstanzen definiert ist und bedeutet "hat den gleichen Wert" , da alle Klassentypen Object erweitern und für alle Objektgleichheitstests verwendet werden sollten. Es gibt viele Fragen bei Cover ==vs Object.equalsund dies ist ein sehr wichtiges Konzept zu verstehen! Zum Beispiel ist dies falsch : "hello" == new String("hello")! Doh!

Antworten:

190

ArrayListhat eine indexOf()Methode . Überprüfen Sie die API auf weitere Informationen, aber so funktioniert es:

private ArrayList<String> _categories; // Initialize all this stuff

private int getCategoryPos(String category) {
  return _categories.indexOf(category);
}

indexOf() gibt schnell genau das zurück, was Ihre Methode zurückgibt.

Jon Egeland
quelle
3
Es ist in Bezug auf die Komplexität nicht "schneller" als der veröffentlichte Code, obwohl es effizienter implementiert werden kann. Außerdem reagiert indexOf hier etwas anders: Der ursprüngliche Code wird [falsch] verwendet, ==während indexOf verwendet equals().
Tatsächlich ist es fast genau derselbe Code (zumindest in dem Sun Java 6-Code, den ich habe), außer dass sie ihn mit einem if-else-Zweig starten, der null separat behandelt.
Yshavit
Es ist verkabelt alte Arrays und List <> haben FindIndex () Methode, aber die API ändert sich in der Mitte für ArrayList: D
Boctulus
16
ArrayList<String> alphabetList = new ArrayList<String>();
alphabetList.add("A"); // 0 index
alphabetList.add("B"); // 1 index
alphabetList.add("C"); // 2 index
alphabetList.add("D"); // 3 index
alphabetList.add("E"); // 4 index
alphabetList.add("F"); // 5 index
alphabetList.add("G"); // 6 index
alphabetList.add("H"); // 7 index
alphabetList.add("I"); // 8 index

int position = -1;
position = alphabetList.indexOf("H");
if (position == -1) {
    Log.e(TAG, "Object not found in List");
} else {
    Log.i(TAG, "" + position);
}

Ausgabe: Listenindex: 7

Wenn Sie H übergeben , wird 7 zurückgegeben . Wenn Sie J übergeben , wird -1 zurückgegeben, da wir den Standardwert auf -1 definiert haben.

Getan

Hiren Patel
quelle
Wie ich das umgekehrt machen kann, für Ihre Lösung ist Ihre Eingabe H und Sie erhalten die Position von H. Angenommen, meine Eingabe ist der Index von 7, wie kann ich den String-Wert dieses Index erhalten. Vielen Dank
Jimale Abdi
1
@JimaleAbdi Mach deineArrayList.get (7). 7 ist deine Position.
Hiren Patel
6

Wenn Ihre Listsortiert ist und einen guten Direktzugriff hat (wie ArrayListauch), sollten Sie dies prüfen Collections.binarySearch. Andernfalls sollten Sie verwenden List.indexOf, wie andere darauf hingewiesen haben.

Aber Ihr Algorithmus ist solide, fwiw (anders als die ==anderen darauf hingewiesen haben).

yshavit
quelle
3

Es gibt in der Tat eine ausgefallene Shmancy-native Funktion in Java, die Sie nutzen sollten.

ArrayList hat eine Instanzmethode namens

indexOf(Object o)

(http://docs.oracle.com/javase/6/docs/api/java/util/ArrayList.html)

Sie können es _categorieswie folgt aufrufen :

_categories.indexOf("camels")

Ich habe keine Erfahrung mit der Programmierung für Android - aber dies würde für eine Standard-Java-Anwendung funktionieren.

Viel Glück.

rostiger Bohnenstiel
quelle
1
native Funktion impliziert für mich C \ C ++.
Hunter McMillen
3

Die Java-API gibt zwei Methoden an, die Sie verwenden können: indexOf(Object obj)und lastIndexOf(Object obj). Der erste gibt den Index des Elements zurück, wenn er gefunden wird, andernfalls -1. Der zweite gibt den letzten Index zurück, das wäre, als würde man die Liste rückwärts durchsuchen.

Danca
quelle
1

Der beste Weg, um die Position des Elements in der Liste zu finden, ist die Verwendung der Benutzeroberfläche "Sammlungen".

Z.B,

List<Integer> sampleList = Arrays.asList(10,45,56,35,6,7);
Collections.binarySearch(sampleList, 56);

Ausgabe: 2

Pradeesh MP
quelle
0

Verwenden Sie die Methode indexOf (), um das erste Vorkommen des Elements in der Auflistung zu ermitteln.

Vasu Dev Garg
quelle