Jawaban:
Ada beberapa cara untuk mencapai ini menggunakan Arrays
kelas utilitas.
Jika array tidak diurutkan dan bukan array primitif:
java.util.Arrays.asList(theArray).indexOf(o)
Jika array adalah primitif dan tidak diurutkan, seseorang harus menggunakan solusi yang ditawarkan oleh salah satu jawaban lain seperti Kerem Baydoğan , Andrew McKinlay's atau Mishax's . Kode di atas akan dikompilasi meskipun theArray
primitif (mungkin memancarkan peringatan) tetapi Anda akan mendapatkan hasil yang benar-benar salah.
Jika array diurutkan, Anda dapat menggunakan pencarian biner untuk kinerja:
java.util.Arrays.binarySearch(theArray, o)
T...
, tipe run-time sebenarnya dari argumen adalah T[]
, dan melewati nol atau lebih parameter T
hasil tipe di dalamnya yang dibungkus menjadi array yang baru dibangun dan diteruskan. Jika parameter yang dikirimkan sudah bertipe T[]
, gula sintaksis dilewati.
.indexOf
) tidak berlaku untuk primitif.
Arrays.toList(list).sublist(from,to).indexOf(o)
untuk mencari elemen dalam rentang [from, to)
.
Array tidak memiliki indexOf()
metode.
Mungkin ArrayUtils
metode Lang Apache Commons ini adalah apa yang Anda cari
import org.apache.commons.lang3.ArrayUtils;
String[] colours = { "Red", "Orange", "Yellow", "Green" };
int indexOfYellow = ArrayUtils.indexOf(colours, "Yellow");
Untuk primitif, jika Anda ingin menghindari tinju, Guava memiliki pembantu untuk array primitif misalnya Ints.indexOf ( array int [], target int)
Tidak ada. Baik menggunakan a java.util.List
*, atau Anda dapat menulis sendiri 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;
}
* Anda dapat membuatnya dari array menggunakan Arrays#asList()
T
itu menyesatkan. Itu tidak memberikan keamanan jenis apa pun, mudah disalahartikan sebagai tipe aman ... lebih baik gunakan Object
indexOf("str", new Object[] {});
,indexOf(new Object(), new String[] {});
indexOf("str", new Date[] {})
,indexOf(new Date(), new String[] {})
Tidak seperti di C # di mana Anda memiliki metode Array.IndexOf , dan JavaScript di mana Anda memiliki metode indexOf , API Java ( Array
dan Arrays
kelas khususnya) tidak memiliki metode seperti itu.
Metode indexOf ini (bersama dengan pelengkap lastIndexOf) didefinisikan dalam antarmuka java.util.List . Perhatikan bahwa indexOf dan lastIndexOf tidak kelebihan beban dan hanya mengambil Obyek sebagai parameter.
Jika array Anda diurutkan , Anda beruntung karena kelas Array mendefinisikan serangkaian kelebihan metode binarySearch yang akan menemukan indeks elemen yang Anda cari dengan kinerja terbaik (O (log n), bukan O (n ), yang terakhir adalah apa yang dapat Anda harapkan dari pencarian berurutan yang dilakukan oleh indexOf). Ada empat pertimbangan:
Array harus diurutkan baik dalam urutan alami atau dalam urutan pembanding yang Anda berikan sebagai argumen, atau paling tidak semua elemen yang "kurang dari" kunci harus datang sebelum elemen dalam array dan semua elemen yang "lebih besar dari" kunci harus datang setelah elemen dalam array;
Tes yang biasanya Anda lakukan dengan indexOf untuk menentukan apakah kunci dalam array (verifikasi jika nilai kembali bukan -1) tidak berlaku dengan binarySearch. Anda perlu memverifikasi bahwa nilai kembali tidak kurang dari nol karena nilai yang dikembalikan akan menunjukkan kunci tidak ada tetapi indeks di mana itu akan diharapkan jika memang ada;
Jika array Anda mengandung banyak elemen yang sama dengan kunci, apa yang Anda dapatkan dari binarySearch tidak ditentukan; ini berbeda dari indexOf yang akan mengembalikan kejadian pertama dan lastIndexOf yang akan mengembalikan kejadian terakhir.
Array booleans mungkin tampak diurutkan jika pertama-tama berisi semua kesalahan dan kemudian semua tanda, tetapi ini tidak masuk hitungan. Tidak ada penggantian metode binarySearch yang menerima array booleans dan Anda harus melakukan sesuatu yang pintar di sana jika Anda ingin O (log n) kinerja ketika mendeteksi di mana true pertama muncul dalam array, misalnya menggunakan array dari Boolean dan konstanta Boolean.FALSE dan Boolean.TRUE.
Jika array Anda tidak diurutkan dan bukan tipe primitif , Anda dapat menggunakan metode indexOf dan lastIndexOf List dengan memunculkan metode asList dari java.util.Arrays. Metode ini akan mengembalikan pembungkus antarmuka AbstractList di sekitar array Anda. Ini melibatkan overhead minimal karena tidak membuat salinan array. Seperti disebutkan, metode ini tidak kelebihan beban sehingga ini hanya akan bekerja pada array tipe referensi.
Jika array Anda tidak diurutkan dan jenis array adalah primitif , Anda beruntung dengan API Java. Tulis sendiri untuk loop, atau metode utilitas statis Anda sendiri, yang tentunya akan memiliki keunggulan kinerja dibandingkan pendekatan asList yang melibatkan beberapa overhead dari instance objek. Jika Anda khawatir bahwa menulis brute force untuk loop yang berulang pada semua elemen array bukanlah solusi yang elegan, terimalah bahwa itulah yang dilakukan Java API ketika Anda memanggil indexOf. Anda dapat membuat sesuatu seperti ini:
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;
}
Jika Anda ingin menghindari menulis metode Anda sendiri di sini, pertimbangkan untuk menggunakannya dari kerangka pengembangan seperti Jambu. Di sana Anda dapat menemukan implementasi indexOf dan lastIndexOf .
Saya tidak ingat "indexOf" pada array selain mengkodekannya sendiri ... meskipun Anda mungkin bisa menggunakan salah satu dari banyak java.util.Arrays#binarySearch(...)
metode (lihat javadoc Array ) jika array Anda mengandung tipe primitif
Antarmuka Daftar memiliki metode indexOf (), dan Anda bisa mendapatkan Daftar dari array Anda dengan metode Array's asList (). Selain itu, Array sendiri tidak memiliki metode seperti itu. Itu memang memiliki metode binarySearch () untuk array yang diurutkan.
Anda mungkin memikirkan java.util.ArrayList , bukan array.
Jawaban Jeffrey Hantin baik tetapi memiliki beberapa kendala, apakah ini yang dilakukan atau tidak ...
Anda dapat menulis metode ekstensi sendiri dan selalu bekerja seperti yang Anda inginkan.
Lists.indexOf(array, x -> item == x); // compare in the way you want
Dan inilah ekstensi Anda
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++;
}
}
Catatan: Anda dapat menggunakan metode ini untuk array bertipe int, Anda juga dapat menggunakan algoritme ini untuk jenis lain dengan perubahan kecil