Antworten:
Es gibt verschiedene Möglichkeiten, dies mithilfe der Arrays
Utility-Klasse zu erreichen.
Wenn das Array nicht sortiert ist und kein Array von Grundelementen ist:
java.util.Arrays.asList(theArray).indexOf(o)
Wenn das Array ist Primitiven und nicht sortiert, sollte man eine Lösung , die durch eine der anderen Antworten wie angeboten verwenden Kerem Baydoğan des , Andrew McKinlay der oder Mishax ist . Der obige Code wird auch dann kompiliert, wenn er theArray
primitiv ist (möglicherweise eine Warnung ausgibt), aber Sie erhalten trotzdem völlig falsche Ergebnisse.
Wenn das Array sortiert ist, können Sie eine binäre Suche nach Leistung verwenden:
java.util.Arrays.binarySearch(theArray, o)
T...
, lautet der tatsächliche Laufzeit-Typ des Arguments. Wenn Sie T[]
null oder mehr Parameter vom Typ übergeben, werden T
diese in ein neu erstelltes Array eingeschlossen und übergeben. Wenn der übergebene Parameter bereits vom Typ ist T[]
, wird der syntaktische Zucker umgangen.
.indexOf
) gilt jedoch nicht für Grundelemente.
Arrays.toList(list).sublist(from,to).indexOf(o)
diese Option , um nach einem Element innerhalb des Bereichs zu suchen [from, to)
.
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");
Wenn Sie für Primitive das Boxen vermeiden möchten, verfügt Guava über Helfer für primitive Arrays, z. B. Ints.indexOf (int [] array, int target).
Da ist gar nichts. Verwenden java.util.List
Sie entweder ein * oder schreiben Sie Ihr eigenes 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 eine aus Ihrem Array mit erstellen Arrays#asList()
T
ist irreführend. Es bietet keine Typensicherheit, leicht zu verwechseln, es ist typsicher ... besser verwenden Objekt
indexOf("str", new Object[] {});
,indexOf(new Object(), new String[] {});
indexOf("str", new Date[] {})
,indexOf(new Date(), new String[] {})
Anders als in C #, wo Sie die Array.IndexOf- Methode haben, und in JavaScript, wo Sie die indexOf- Methode haben, hat die Java-API (insbesondere die Array
und- Arrays
Klassen) 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, denn die Arrays-Klasse definiert eine Reihe von Überladungen der binarySearch-Methode, die den Index des gesuchten Elements mit der bestmöglichen Leistung (O (log n) anstelle von O (n) finden ), wobei letzteres das ist, was Sie von einer sequentiellen Suche durch indexOf) erwarten können. Es gibt vier Überlegungen:
Das Array muss entweder in natürlicher Reihenfolge oder in der Reihenfolge eines Komparators sortiert sein, 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 stehen, die sind "größer als", muss der Schlüssel nach diesem Element im Array kommen;
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 angibt, dass der Schlüssel nicht vorhanden ist, sondern der Index, bei dem er erwartet würde, wenn er vorhanden wäre.
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.
Ein Array von Booleschen Werten scheint sortiert zu sein, wenn es zuerst alle Fehler und dann alle Wahrheiten enthält, dies zählt jedoch nicht. Es gibt keine Überschreibung der binarySearch-Methode, die ein Array von Booleschen Werten akzeptiert, und Sie müssen dort etwas Kluges tun, wenn Sie eine O (log n) -Leistung wünschen, wenn Sie erkennen, wo das erste true in einem Array angezeigt wird, z. B. mithilfe eines Arrays von Boolesche Werte und die Konstanten Boolean.FALSE und Boolean.TRUE.
Wenn Ihr Array nicht sortiert und nicht primitiv ist , können Sie die Methoden indexOf und lastIndexOf von List verwenden, indem Sie die asList- Methode von java.util.Arrays aufrufen . Diese Methode gibt einen AbstractList-Schnittstellen-Wrapper um Ihr Array zurück. Der Aufwand ist minimal, da keine Kopie des Arrays erstellt wird. Wie bereits erwähnt, ist diese Methode nicht überladen, sodass dies nur für Arrays von Referenztypen funktioniert.
Wenn Ihr Array nicht sortiert ist und die Art der Anordnung ist primitiv , sind Sie mit der Java API kein Glück. Schreiben Sie Ihre eigene for-Schleife oder Ihre eigene statische Dienstprogrammmethode, die sicherlich Leistungsvorteile gegenüber dem asList-Ansatz bietet, der einen gewissen Aufwand für die Objektinstanziierung mit sich bringt. Wenn Sie befürchten, dass das Schreiben einer Brute-Force-for-Schleife, die alle Elemente des Arrays durchläuft, keine elegante Lösung darstellt, akzeptieren Sie, dass die Java-API genau dies 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 indexOf und lastIndexOf .
Ich erinnere mich nicht an ein "indexOf" für Arrays, außer es für sich selbst zu codieren ... obwohl Sie wahrscheinlich eine der vielen java.util.Arrays#binarySearch(...)
Methoden verwenden könnten (siehe Arrays javadoc ), wenn Ihr Array primitive Typen enthält
Die List-Schnittstelle verfügt über eine indexOf () -Methode, und Sie können mit der asList () -Methode von Array eine Liste aus Ihrem Array abrufen. Davon abgesehen hat Array selbst keine solche Methode. Es gibt eine binarySearch () -Methode für sortierte Arrays.
Sie denken wahrscheinlich an die java.util.ArrayList , nicht an das Array.
Jeffrey Hantins Antwort ist gut, aber es gibt einige Einschränkungen, wenn dies dies oder das tut ...
Sie können Ihre eigene Erweiterungsmethode schreiben, die immer so funktioniert, 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);
}
}
int findIndex(int myElement, int[] someArray){
int index = 0;
for(int n: someArray){
if(myElement == n) return index;
else index++;
}
}
Hinweis: Sie können diese Methode für Arrays vom Typ int verwenden. Sie können diesen Algorithmus auch für andere Typen mit geringfügigen Änderungen verwenden