wake-up-neo.com

Wo ist Javas Array indexOf?

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

160
Jamie

Es gibt verschiedene Möglichkeiten, dies mit der Utility-Klasse Arrays zu erreichen.

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

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

Wenn das Array primitiv und nicht sortiert ist, sollte eine Lösung verwendet werden, die durch eine der anderen Antworten wie Kerem Baydoğans , Andrew McKinlay's oder Mishax's . Der obige Code wird kompiliert, auch wenn theArray primitiv ist (möglicherweise eine Warnung ausgibt), Sie jedoch trotzdem völlig falsche Ergebnisse erhalten.

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

Java.util.Arrays.binarySearch(theArray, o)
213
Jeffrey Hantin

Array hat keine indexOf()-Methode.

Vielleicht ist diese Apache Commons Lang ArrayUtils Methode genau das, wonach Sie suchen

import org.Apache.commons.lang3.ArrayUtils;

String[] colours = { "Red", "Orange", "Yellow", "Green" };

int indexOfYellow = ArrayUtils.indexOf(colours, "Yellow");
52
Kerem Baydoğan

Da ist gar nichts. Verwenden Sie entweder einen Java.util.List *, oder Sie können Ihren eigenen indexOf() schreiben:

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 einen aus Ihrem Array erstellen, indem Sie Arrays#asList() verwenden.

18
Matt Ball

Wenn Sie Boxen vermeiden möchten, hat Guava Helfer für primitive Arrays, z. Ints.indexOf (int [] array, int target)

16
Andrew McKinlay

Anders als in C #, wo Sie die Methode Array.IndexOf haben, und JavaScript, wenn Sie die Methode indexOf verwenden, verfügen Java-API (insbesondere die Klassen Array und Arrays) über keine solche Methode. 

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

Wenn Ihr Array sortiert ist, haben Sie Glück, weil die Arrays-Klasse eine Reihe von Überladungen der binarySearch-Methode definiert, die den Index des gesuchten Elements mit bestmöglicher Leistung (O (log n)) findet von O (n), letzteres ist das, was Sie von einer sequentiellen Suche von 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" sind, der Schlüssel vor diesem Element im Array und allen Elementen stehen "größer als" muss der Schlüssel hinter diesem Element im Array stehen;

  2. Der Test, den Sie normalerweise mit indexOf durchführen, um festzustellen, ob sich ein Schlüssel im Array befindet (ü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, der Index jedoch, an dem er erwartet wird, 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 Elementen scheint sortiert zu sein, wenn es zuerst alle falschen Werte und dann alle Trues enthält. Dies zählt jedoch nicht. Es gibt keine Überschreibung der binarySearch-Methode, die ein Array von Booleans akzeptiert, und Sie müssen dort etwas cleveres tun, wenn Sie die Leistung von O (log n) wollen, wenn Sie feststellen, wo der erste Wert wahr in einem Array erscheint, beispielsweise mit einem Array von Booleans und die Konstanten Boolean.FALSE und Boolean.TRUE.

Wenn Ihr Array nicht sortiert ist und kein primitiver Typ ist, können Sie die Methoden indexOf und lastIndexOf von List verwenden, indem Sie die Methode asList von Java.util.Arrays aufrufen. Diese Methode gibt einen AbstractList-Schnittstellen-Wrapper für Ihr Array zurück. Es ist ein minimaler Aufwand erforderlich, da keine Kopie des Arrays erstellt wird. Wie bereits erwähnt, ist diese Methode nicht überlastet, sodass sie nur mit Arrays von Referenztypen funktioniert.

Wenn Ihr Array nicht sortiert ist und der Typ des Arrays primitiv ist, 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 mit sich bringt, der mit einer Objekt-Instantiierung einhergeht. Wenn Sie befürchten, dass das Schreiben einer Brute-for-For-Schleife, die alle Elemente des Arrays durchläuft, keine elegante Lösung ist, akzeptieren Sie, dass dies genau das ist, was die Java-API beim Aufruf von indexOf ausführt. 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, dass Sie hier Ihre eigene Methode schreiben, sollten Sie eine Methode aus einem Entwicklungs-Framework wie Guava verwenden. Dort finden Sie eine Implementierung von indexOf und lastIndexOf

12
Mishax

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

10
James

Ich kann mich nicht an ein "indexOf" für Arrays erinnern, das nicht für Sie selbst codiert wird ... obwohl Sie möglicherweise eine der vielen Java.util.Arrays#binarySearch(...)-Methoden verwenden könnten (siehe Arrays javadoc ), wenn Ihr Array primitive Typen enthält

6
Kellindil

Die List-Schnittstelle verfügt über eine indexOf () -Methode, und Sie können mit der asList () -Methode von Array eine Liste von Ihrem Array erhalten. Ansonsten hat Array selbst keine solche Methode. Es verfügt über eine binarySearch () -Methode für sortierte Arrays.

5
Mike Yockey

Arrays selbst haben diese Methode nicht. Eine Liste führt jedoch Folgendes aus: indexOf

4
Igor

Sie denken wahrscheinlich an die Java.util.ArrayList , nicht an das Array.

3
duffymo

In Java-Arrays gibt es keine direkte indexOf-Funktion.

2
gambo

Jeffrey Hantin 's Antwort ist gut, aber sie hat einige Einschränkungen, wenn das hier oder anders geht ...

Sie können Ihre eigene Erweiterungsmethode schreiben und sie funktioniert immer so, wie Sie es möchten.

Lists.indexOf(array, x -> item == x); // compare in the way you want

Und hier ist deine Erweiterung

public final class Lists {
    private Lists() {
    }

    public static <T> int indexOf(T[] array, Predicate<T> predicate) {
        for (int i = 0; i < array.length; i++) {
            if (predicate.test(array[i])) return i;
        }
        return -1;
    }

    public static <T> int indexOf(List<T> list, Predicate<T> predicate) {
        for (int i = 0; i < list.size(); i++) {
            if (predicate.test(list.get(i))) return i;
        }
        return -1;
    }

    public interface Predicate<T> {
        boolean test(T t);
    }
}
0
M.kazem Akhgary