Muszę przegapić coś bardzo oczywistego, ale przeszukałem wszystko i nie mogę znaleźć tej metody.
198
Istnieje kilka sposobów na osiągnięcie tego celu Arrays
klasy narzędziowej.
Jeśli tablica nie jest posortowana i nie jest tablicą operacji podstawowych:
java.util.Arrays.asList(theArray).indexOf(o)
Jeśli tablica jest prymitywna i nie jest posortowana, należy skorzystać z rozwiązania oferowanego przez jedną z pozostałych odpowiedzi, takich jak Kerem Baydoğan , Andrew McKinlay lub Mishax . Powyższy kod zostanie skompilowany, nawet jeślitheArray
jest prymitywny (prawdopodobnie emituje ostrzeżenie), ale mimo to otrzymasz całkowicie niepoprawne wyniki.
Jeśli tablica jest posortowana, możesz skorzystać z binarnego wyszukiwania wydajności:
java.util.Arrays.binarySearch(theArray, o)
T...
, rzeczywistym typem argumentu w czasie wykonywania jestT[]
, a przekazanie zera lub więcej parametrów typuT
powoduje, że są one pakowane w nowo zbudowaną tablicę i przekazywane. Jeśli przekazywany parametr jest już typuT[]
, cukier syntaktyczny jest pomijany..indexOf
) nie jest jednak poprawne dla prymitywów.Arrays.toList(list).sublist(from,to).indexOf(o)
do wyszukiwania elementu w zakresie[from, to)
.Tablica nie ma
indexOf()
metody.Może ta
ArrayUtils
metoda Apache Commons Lang jest tym, czego szukaszźródło
W przypadku prymitywów, jeśli chcesz uniknąć boksowania, Guava ma pomocniki dla prymitywnych tablic, np. Ints.indexOf (int [] tablica, int cel)
źródło
Nie ma żadnego. Albo użyj
java.util.List
*, albo możesz napisać własnyindexOf()
:* możesz zrobić jeden z tablicy za pomocą
Arrays#asList()
źródło
T
jest mylące. Nie zapewnia żadnego rodzaju bezpieczeństwa, łatwo pomylić, jest bezpieczny typu ... lepsze wykorzystanie ObiektindexOf("str", new Object[] {});
,indexOf(new Object(), new String[] {});
indexOf("str", new Date[] {})
,indexOf(new Date(), new String[] {})
W przeciwieństwie do C #, w którym masz metodę Array.IndexOf , i JavaScript, w którym masz metodę indexOf , interfejs API Java (
Array
iArrays
w szczególności klasy) nie ma takiej metody.Ta metoda indexOf (wraz z uzupełnieniem lastIndexOf) jest zdefiniowana w interfejsie java.util.List . Zauważ, że indexOf i lastIndexOf nie są przeciążone i przyjmują obiekt jako parametr.
Jeśli twoja tablica jest posortowana , masz szczęście, ponieważ klasa Arrays definiuje serię przeciążeń metody binarySearch, która znajdzie indeks poszukiwanego elementu z najlepszą możliwą wydajnością (O (log n) zamiast O (n ), przy czym ten ostatni jest tym, czego można oczekiwać od wyszukiwania sekwencyjnego przeprowadzonego przez indexOf). Istnieją cztery kwestie:
Tablica musi być posortowana albo w naturalnej kolejności, albo w kolejności komparatora, który podasz jako argument, lub przynajmniej wszystkie elementy, które są „mniejsze niż” klucz, muszą znajdować się przed tym elementem w tablicy i wszystkimi elementami, które są „większe niż” klucz musi wystąpić po tym elemencie w tablicy;
Test normalnie wykonywany za pomocą indexOf w celu ustalenia, czy klucz znajduje się w tablicy (sprawdź, czy zwracana wartość nie jest równa -1) nie zachowuje się w binarySearch. Musisz sprawdzić, czy zwracana wartość jest nie mniejsza niż zero, ponieważ zwrócona wartość wskaże, że klucz nie jest obecny, ale indeks, w którym można by się spodziewać, gdyby istniał;
Jeśli tablica zawiera wiele elementów równych kluczowi, to, co otrzymujesz z binarySearch, jest niezdefiniowane; różni się to od indexOf, który zwróci pierwsze wystąpienie, i lastIndexOf, który zwróci ostatnie wystąpienie.
Tablica booleanów może wydawać się posortowana, jeśli najpierw zawiera wszystkie falały, a następnie wszystkie prawdy, ale to się nie liczy. Nie ma przesłonięcia metody binarySearch, która akceptuje tablicę boolanów, i musisz tam zrobić coś sprytnego, jeśli chcesz wydajności O (log n) podczas wykrywania, gdzie pojawia się pierwsza prawda w tablicy, na przykład używając tablicy Booleany i stałe Boolean.FALSE i Boolean.TRUE.
Jeśli twoja tablica nie jest posortowana i nie jest pierwotna , możesz użyć metod indexOf i lastIndexOf List, wywołując asList metodę z java.util.Arrays. Ta metoda zwróci opakowanie interfejsu AbstractList wokół tablicy. Obejmuje minimalny narzut, ponieważ nie tworzy kopii tablicy. Jak wspomniano, ta metoda nie jest przeciążona, więc będzie działać tylko na tablicach typów referencyjnych.
Jeśli twoja tablica nie jest posortowana, a jej typ jest prymitywny , nie masz szczęścia z interfejsem API Java. Napisz własną pętlę for lub własną statyczną metodę użyteczności, która z pewnością będzie miała przewagę wydajności nad podejściem asList, które wiąże się z pewnym nakładem na tworzenie instancji obiektu. Jeśli obawiasz się, że napisanie brutalnej siły dla pętli iterującej wszystkie elementy tablicy nie jest eleganckim rozwiązaniem, zaakceptuj to, co dokładnie robi Java API, gdy wywołujesz indexOf. Możesz zrobić coś takiego:
Jeśli chcesz uniknąć pisania tutaj własnej metody, zastanów się nad użyciem jej z platformy programistycznej, takiej jak Guava. Tam możesz znaleźć implementację indexOf i lastIndexOf .
źródło
Java
ArrayList
maindexOf
metodę. Macierze Java nie mają takiej metody.źródło
ArrayList
- każda JavaList
maindexOf()
.Nie przypominam sobie „indexOf” na tablicach innych niż kodowanie go dla siebie ... chociaż prawdopodobnie możesz użyć jednej z wielu
java.util.Arrays#binarySearch(...)
metod (zobacz Array javadoc ), jeśli twoja tablica zawiera prymitywne typyźródło
Interfejs List ma metodę indexOf (), a Listę można uzyskać ze swojej tablicy za pomocą metody asList () Array. Poza tym sam Array nie ma takiej metody. Ma metodę binarySearch () dla posortowanych tablic.
źródło
Same tablice nie mają tej metody. Lista jednak robi: indexOf
źródło
ArrayList
- każda JavaList
maindexOf()
.Prawdopodobnie myślisz o java.util.ArrayList , a nie o tablicy.
źródło
W tablicach Java nie ma bezpośredniej funkcji indexOf.
źródło
Odpowiedź Jeffreya Hantina jest dobra, ale wiąże się z pewnymi ograniczeniami, jeśli to zrób to, albo zrób to ...
Możesz napisać własną metodę rozszerzenia i zawsze działa ona tak, jak chcesz.
A oto twoje rozszerzenie
źródło
Uwaga: możesz użyć tej metody dla tablic typu int, możesz także użyć tego algorytmu dla innych typów z niewielkimi zmianami
źródło