Saya pasti kehilangan sesuatu yang sangat jelas, tetapi saya telah mencari di seluruh dan tidak dapat menemukan metode ini.
198
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 adalahT[]
, dan melewati nol atau lebih parameterT
hasil tipe di dalamnya yang dibungkus menjadi array yang baru dibangun dan diteruskan. Jika parameter yang dikirimkan sudah bertipeT[]
, 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 carisumber
Untuk primitif, jika Anda ingin menghindari tinju, Guava memiliki pembantu untuk array primitif misalnya Ints.indexOf ( array int [], target int)
sumber
Tidak ada. Baik menggunakan a
java.util.List
*, atau Anda dapat menulis sendiriindexOf()
:* Anda dapat membuatnya dari array menggunakan
Arrays#asList()
sumber
T
itu menyesatkan. Itu tidak memberikan keamanan jenis apa pun, mudah disalahartikan sebagai tipe aman ... lebih baik gunakan ObjectindexOf("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
danArrays
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:
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 .
sumber
Java
ArrayList
memilikiindexOf
metode. Array Java tidak memiliki metode seperti itu.sumber
ArrayList
- setiap JawaList
memilikiindexOf()
.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 primitifsumber
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.
sumber
Array sendiri tidak memiliki metode itu. Namun, Daftar tidak: indexOf
sumber
ArrayList
- setiap JawaList
memilikiindexOf()
.Anda mungkin memikirkan java.util.ArrayList , bukan array.
sumber
Tidak ada fungsi indexOf langsung di array java.
sumber
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.
Dan inilah ekstensi Anda
sumber
Catatan: Anda dapat menggunakan metode ini untuk array bertipe int, Anda juga dapat menggunakan algoritme ini untuk jenis lain dengan perubahan kecil
sumber