Wo ist Javas Array indexOf?

Lesezeit: 6 Minuten

Wo ist Javas Array
Jamie

Ich muss etwas sehr Offensichtliches übersehen, aber ich habe überall gesucht und kann diese Methode nicht finden.

1645847828 172 Wo ist Javas Array
Jeffrey Hantin

Es gibt ein paar Möglichkeiten, dies zu erreichen, indem Sie die verwenden Arrays Gebrauchsklasse.

Wenn das Array nicht sortiert ist und ist nicht ein Array von Primitiven:

java.util.Arrays.asList(theArray).indexOf(o)

Wenn das Array ist Primitive und nicht sortiert, sollte man eine Lösung verwenden, die von einer der anderen Antworten wie Kerem Baydoğan’s, Andrew McKinlay’s oder Mishax’s angeboten wird. Der obige Code wird auch dann kompiliert, wenn theArray ist primitiv (gibt möglicherweise eine Warnung aus), aber Sie erhalten trotzdem völlig falsche Ergebnisse.

Wenn das Array sortiert ist, können Sie eine binäre Suche für die Leistung verwenden:

java.util.Arrays.binarySearch(theArray, o)

  • Ich bin mir ziemlich sicher, dass diese Antwort zumindest für Java 1.6 falsch ist: download.oracle.com/javase/6/docs/api/java/util/… asList wandelt die Liste der Argumente in eine Liste um, nicht das Argument selbst.

    – Alexandru

    28. Juni 2011 um 12:13 Uhr


  • @Alexandru Ellipsis Handling ist syntaktischer Zucker. Wenn Sie ein Argument eingegeben haben T...ist der tatsächliche Laufzeittyp des Arguments T[]und Übergeben von null oder mehr Parametern des Typs T führt dazu, dass sie in ein neu konstruiertes Array eingeschlossen und übergeben werden. Wenn der übergebene Parameter bereits vom Typ ist T[]wird der syntaktische Zucker umgangen.

    – Jeffrey Hantin

    29. Juni 2011 um 2:37 Uhr

  • Ich verstehe dein Argument. Die Lösung (.indexOf) gilt jedoch nicht für Primitive.

    – Alexandru

    29. Juni 2011 um 8:15 Uhr

  • Da niemand erwähnt hat: Arrays.asList verwendet das bereits vorhandene Array als Hintergrund. (Das heißt, es besteht keine Sorge, dass eine Kopie erstellt wird.)

    – Joshua Goldberg

    28. November 2011 um 21:09 Uhr

  • @Notinlist Die Java-Jungs haben auch daran gedacht. Verwenden Arrays.toList(list).sublist(from,to).indexOf(o) um nach einem Element innerhalb des Bereichs zu suchen [from, to).

    – Mario Carneiro

    Jan 14, 2016 at 22:23


Wo ist Javas Array
Kerem Baydoğan

Array has no indexOf() method.

Maybe this Apache Commons Lang ArrayUtils method is what you are looking for

import org.apache.commons.lang3.ArrayUtils;

String[]  Farben = { "Rot", "Orange", "Gelb", "Grün" };  int indexOfYellow = ArrayUtils.indexOf (Farben, "Gelb");

  • Eclipse findet diese Importbibliothek nicht.

    – Omore

    2. Mai 2017 um 19:38 Uhr

Für Primitive, wenn Sie Boxen vermeiden möchten, Guave hat Helfer für primitive Arrays zB Ints.indexOf(int[] Array, Int-Ziel)

  • Die anderen Lösungen erstellen alle neue Strings oder Listen oder behandeln nur einzelne Elemente. Mit Chars.indexOf von Guava können Sie den Index eines Arrays in einem Array abrufen. Dies ist die richtige Lösung.

    – Glücklicher Ingenieur

    26. Januar 2016 um 1:14 Uhr

Wo ist Javas Array
Mattball

Da ist gar nichts. Verwenden Sie entweder a java.util.List*, oder Sie können Ihre eigene schreiben indexOf():

public static <T> int indexOf(T needle, T[] haystack)
{
    for (int i=0; i<haystack.length; i++)
    {
        if (haystack[i] != null && haystack[i].equals(needle)
            || needle == null && haystack[i] == null) return i;
    }

    return -1;
}

*Sie können eines aus Ihrem Array erstellen, indem Sie verwenden Arrays#asList()

1645847830 108 Wo ist Javas Array
Mischax

Anders als in C#, wo Sie die Array.IndexOf -Methode und JavaScript, wo Sie die haben Index von Methode, Javas API (die Array und Arrays insbesondere Klassen) haben keine solche Methode.

Diese Methode indexOf (zusammen mit ihrem Komplement lastIndexOf) ist in der definiert java.util.List Schnittstelle. Beachten Sie, dass indexOf und lastIndexOf nicht überladen sind und nur ein Objekt als Parameter annehmen.

Wenn Ihr Array sortiert ist, haben Sie Glück, denn die Klasse Arrays definiert eine Reihe von Überladungen der Methode binarySearch, die den Index des gesuchten Elements mit der bestmöglichen Leistung findet (O(log n) anstelle von O(n), letzteres ist was Sie von einer sequentiellen Suche mit indexOf erwarten können). Es gibt vier Überlegungen:

  1. Das Array muss entweder in natürlicher Reihenfolge oder in der Reihenfolge eines Comparators sortiert werden, den Sie als Argument angeben, oder zumindest müssen alle Elemente, die “kleiner als” der Schlüssel sind, vor diesem Element im Array und allen Elementen, die “größer als” sind, muss der Schlüssel nach diesem Element im Array kommen;

  2. Der Test, den Sie normalerweise mit indexOf durchführen, um festzustellen, ob ein Schlüssel im Array enthalten ist (überprüfen Sie, ob der Rückgabewert nicht -1 ist), gilt nicht für binarySearch. Sie müssen sicherstellen, dass der Rückgabewert nicht kleiner als Null ist, da der zurückgegebene Wert anzeigt, dass der Schlüssel nicht vorhanden ist, aber der Index, an dem er erwartet würde, wenn er vorhanden wäre;

  3. Wenn Ihr Array mehrere Elemente enthält, die dem Schlüssel entsprechen, ist das, was Sie von binarySearch erhalten, undefiniert; Dies unterscheidet sich von indexOf, das das erste Vorkommen zurückgibt, und lastIndexOf, das das letzte Vorkommen zurückgibt.

  4. Ein Array von booleschen Werten scheint sortiert zu sein, wenn es zuerst alle falschen und dann alle wahren enthält, aber das zählt nicht. Es gibt keine Überschreibung der Methode binarySearch, die ein Array von booleschen Werten akzeptiert, und Sie müssen dort etwas Cleveres tun, wenn Sie die Leistung von O(log n) beim Ermitteln der ersten wahren Stelle in einem Array erzielen möchten, z. B. mithilfe eines Arrays von Boolesche Werte und die Konstanten Boolean.FALSE und Boolean.TRUE.

Wenn Ihr Array nicht sortiert und kein primitiver Typ istkönnen Sie die indexOf- und lastIndexOf-Methoden von List verwenden, indem Sie die aufrufen alsListe Methode von java.util.Arrays. Diese Methode gibt einen AbstractList-Schnittstellen-Wrapper um Ihr Array zurück. Es ist mit minimalem Overhead verbunden, da keine Kopie des Arrays erstellt wird. Wie bereits erwähnt, ist diese Methode nicht überladen, sodass sie nur für Arrays von Referenztypen funktioniert.

Wenn Ihr Array nicht sortiert ist, und den Typ des Arrays ist Primitive, haben Sie mit der Java-API kein Glück. Schreiben Sie Ihre eigene for-Schleife oder Ihre eigene statische Utility-Methode, die sicherlich Leistungsvorteile gegenüber dem asList-Ansatz hat, der einen gewissen Overhead einer Objektinstanziierung mit sich bringt. Falls Sie befürchten, dass das Schreiben einer Brute-Force-For-Schleife, die alle Elemente des Arrays durchläuft, keine elegante Lösung ist, akzeptieren Sie, dass die Java-API genau das tut, wenn Sie indexOf aufrufen. Sie können so etwas machen:

public static int indexOfIntArray(int[] array, int key) {
    int returnvalue = -1;
    for (int i = 0; i < array.length; ++i) {
        if (key == array[i]) {
            returnvalue = i;
            break;
        }
    }
    return returnvalue;
}

Wenn Sie vermeiden möchten, hier eine eigene Methode zu schreiben, sollten Sie eine aus einem Entwicklungsframework wie Guava verwenden. Dort finden Sie eine Implementierung von Index von und lastIndexOf.

1645847830 74 Wo ist Javas Array
James

Java ArrayList hat ein indexOf Methode. Java-Arrays haben keine solche Methode.

1645847830 415 Wo ist Javas Array
Kellindil

Ich erinnere mich nicht an ein “indexOf” auf Arrays, außer es für sich selbst zu codieren … obwohl Sie wahrscheinlich eines der vielen verwenden könnten java.util.Arrays#binarySearch(...) Methoden (siehe die Arrays javadoc), wenn Ihr Array primitive Typen enthält

859940cookie-checkWo ist Javas Array indexOf?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy