Jauh di sekitarnya, tetapi Anda dapat menggunakan loop for: "for (String s: VALUES) if (s.equals (" MYVALUE ")) mengembalikan true;
Zack
70
@camickr. Untuk pertanyaan Anda, saya memutakhirkan pertanyaan ini dan jawaban Anda -sekarang- karena itu menyelamatkan saya 30 menit dan 20 baris penulisan kode jelek untuk loop, -sekarang-. Tidak membacanya tiga tahun lalu. (BTW, terima kasih :))
Pursuit
3
@ camickr - Saya memiliki situasi yang hampir sama dengan yang satu ini: stackoverflow.com/a/223929/12943 Itu hanya terus mendapatkan suara namun hanya salinan / tempel dari dokumentasi matahari. Saya kira skor didasarkan pada seberapa banyak bantuan yang Anda berikan dan bukan berapa banyak usaha yang Anda lakukan - dan kebanyakan seberapa cepat Anda mempostingnya! Mungkin kita telah menemukan rahasia John Skeet! Jawaban yang bagus, +1 untuk Anda.
@camickr karena orang-orang, seperti saya, google pertanyaan, klik pada hasil SO, lihat jawaban Anda, tes itu, berhasil, undur suara jawabannya dan kemudian pergi.
Aequitas
Jawaban:
2925
Arrays.asList(yourArray).contains(yourValue)
Peringatan: ini tidak berfungsi untuk array primitif (lihat komentar).
Sejak java-8 Anda sekarang dapat menggunakan Streaming.
Saya agak penasaran dengan kinerja ini dibandingkan dengan fungsi pencarian di kelas Array versus iterasi pada array dan menggunakan fungsi equals () atau == untuk primitif.
Thomas Owens
186
Anda tidak akan kehilangan banyak, karena asList () mengembalikan ArrayList yang memiliki larik. Konstruktor hanya akan mengubah referensi sehingga tidak banyak pekerjaan yang harus dilakukan di sana. Dan berisi () / indexOf () akan beralih dan menggunakan equals (). Untuk primitif, Anda sebaiknya lebih baik mengkodekannya sendiri. Untuk String atau kelas lain, perbedaannya tidak akan terlihat.
Joey
18
Aneh, NetBeans mengklaim bahwa 'Array.asList (liburan)' untuk 'int [] libur' mengembalikan 'daftar <int []>', dan bukan 'daftar <int>'. Itu hanya mengandung satu elemen tunggal. Meaning the Contains tidak berfungsi karena hanya memiliki satu elemen; array int.
Nyerguds
62
Nyerguds: memang, ini tidak bekerja untuk primitif. Dalam tipe java primitif tidak bisa generik. asList dinyatakan sebagai <T> Daftar <T> asList (T ...). Ketika Anda memasukkan int [] ke dalamnya, kompiler menyimpulkan T = int [] karena ia tidak dapat menyimpulkan T = int, karena primitif tidak bisa generik.
CromTheDestroyer
28
@Joey hanya catatan, ini merupakan ArrayList, tapi tidak java.util.ArrayListseperti yang Anda harapkan, kelas nyata yang dikembalikan: java.util.Arrays.ArrayList<E>didefinisikan sebagai: public class java.util.Arrays {private static class ArrayList<E> ... {}}.
TWiStErRob
363
Pembaruan ringkas untuk Java SE 9
Array referensi buruk. Untuk kasus ini kita mengejar set. Sejak Java SE 9 kita miliki Set.of.
Ini adalah statik yang bisa berubah yang FindBugs akan bilang sangat nakal. Jangan modifikasi statika dan jangan izinkan kode lain melakukannya juga. Paling tidak absolut, bidang harus pribadi:
(Orang paranoid, seperti saya, mungkin merasa lebih nyaman jika ini dibungkus Collections.unmodifiableSet- itu bahkan dapat dipublikasikan).
(* Untuk sedikit lebih pada merek, API koleksi diperkirakan masih kehilangan tipe koleksi yang tidak berubah dan sintaksisnya masih terlalu bertele-tele, untuk selera saya.)
Kecuali O (N) untuk membuat koleksi di tempat pertama :)
Drew Noakes
61
Jika statis, mungkin akan digunakan beberapa kali. Jadi, waktu yang dihabiskan untuk menginisialisasi set memiliki peluang bagus untuk menjadi cukup kecil dibandingkan dengan biaya banyak pencarian linier.
Xr.
1
Menciptakan maka koleksi akan didominasi oleh waktu pemuatan kode (yang secara teknis O (n) tetapi praktis konstan).
Tom Hawtin - tackline
2
@ TomHawtin-tackline Mengapa Anda mengatakan "khususnya di sini kami ingin satu set"? Apa keuntungan dari Set (HashSet) dalam kasus ini? Mengapa "array referensi" buruk (menurut "array referensi" maksud Anda ArrayList didukung oleh array yang dihasilkan oleh panggilan ke Arrays.asList)?
Basil Bourque
6
@nmr TreeSetakan menjadi O(log n). HashSets diskalakan sedemikian rupa sehingga jumlah rata-rata elemen dalam ember kira-kira konstan. Setidaknya untuk array hingga 2 ^ 30. Mungkin ada pengaruh dari, katakanlah, cache perangkat keras yang diabaikan oleh analisis big-O. Juga mengasumsikan fungsi hash bekerja secara efektif.
@ max4ever Terkadang Anda sudah menyertakan perpustakaan ini (untuk alasan lain) dan ini adalah jawaban yang benar-benar valid. Saya mencari ini dan saya sudah bergantung pada Apache Commons Lang. Terima kasih atas jawaban ini.
GuiSim
1
Atau Anda bisa menyalin metode (dan depedensi jika ada).
Buffalo
10
@ max4ever Sebagian besar aplikasi android diminimalkan oleh Proguard, hanya menempatkan kelas dan fungsi yang Anda butuhkan ke dalam aplikasi Anda. Itu membuatnya sama dengan menggulung sendiri, atau menyalin sumber dari apache. Dan siapa pun yang tidak menggunakan minimalisasi itu tidak perlu mengeluh tentang 700kb atau 78kb :)
Kenyakorn Ketsombut
158
Cukup dengan menerapkannya dengan tangan:
publicstatic<T>boolean contains(final T[] array,final T v){for(final T e : array)if(e == v || v !=null&& v.equals(e))returntrue;returnfalse;}
Perbaikan:
The v != nullkondisi konstan dalam metode. Itu selalu mengevaluasi ke nilai Boolean yang sama selama pemanggilan metode. Jadi jika inputnya arraybesar, lebih efisien untuk mengevaluasi kondisi ini hanya sekali, dan kita bisa menggunakan kondisi yang disederhanakan / lebih cepat di dalam forloop berdasarkan hasil. contains()Metode yang ditingkatkan :
publicstatic<T>boolean contains2(final T[] array,final T v){if(v ==null){for(final T e : array)if(e ==null)returntrue;}else{for(final T e : array)if(e == v || v.equals(e))returntrue;}returnfalse;}
@Phoexo Solusi ini jelas lebih cepat karena jawaban yang diterima membungkus array ke dalam daftar, dan memanggil metode contain () pada daftar itu sementara solusi saya pada dasarnya melakukan apa yang berisi () hanya akan dilakukan.
icza
10
@AlastorMoody e == v melakukan pemeriksaan kesetaraan referensi yang sangat cepat. Jika objek yang sama (sama dengan referensi) dalam array, itu akan ditemukan lebih cepat. Jika itu bukan contoh yang sama, itu mungkin masih sama seperti diklaim oleh metode equals (), ini adalah yang diperiksa jika referensi tidak sama.
icza
20
Mengapa fungsi ini bukan bagian dari Java? Tidak heran orang-orang mengatakan Java bengkak ... lihat semua jawaban di atas yang menggunakan banyak perpustakaan ketika semua yang Anda butuhkan adalah untuk loop. Anak-anak zaman sekarang!
phreakhead
4
@phreakhead Ini adalah bagian dari Jawa, lihatCollection.contains(Object)
Steve Kuo
11
@icza Jika Anda melihat sumber Arraysdan ArrayListternyata ini belum tentu lebih cepat daripada menggunakan versi Arrays.asList(...).contains(...). Overhead membuat ArrayListsangat kecil, dan ArrayList.contains()menggunakan loop cerdas (sebenarnya menggunakan dua loop berbeda) daripada yang ditunjukkan di atas (JDK 7).
Kode di bawah ini salah, tercantum di sini untuk kelengkapan. binarySearch () HANYA dapat digunakan pada array yang diurutkan. Anda akan menemukan hasilnya aneh di bawah ini. Ini adalah opsi terbaik ketika array diurutkan.
publicstaticboolean binarySearch(String[] arr,String targetValue){int a =Arrays.binarySearch(arr, targetValue);return a >0;}
contoh pencarian biner Anda harus mengembalikan a> 0;
Will Sherwood
6
Mengapa? Saya pikir itu harus mengembalikan a> -1, karena 0 akan menunjukkan bahwa itu terdapat di kepala array.
bawah
1
Varian pertama dengan (a >= 0)benar, cukup periksa dokumen , mereka mengatakan "Perhatikan bahwa ini menjamin bahwa nilai pengembalian akan> = 0 jika dan hanya jika kunci ditemukan".
Yoory N.
Mengapa berfungsi ke String dan bukan ke int? boolean statis ada (int [] ints, int k) {return Arrays.asList (ints) .contains (k); }
Willians Martins
71
Jika array tidak diurutkan, Anda harus mengulang semuanya dan membuat panggilan untuk menyamakan masing-masing.
Jika array diurutkan, Anda dapat melakukan pencarian biner, ada satu di kelas Array .
Secara umum, jika Anda akan melakukan banyak pemeriksaan keanggotaan, Anda mungkin ingin menyimpan semuanya dalam Set, bukan dalam array.
Juga, seperti yang saya katakan dalam jawaban saya, jika Anda menggunakan kelas Array, Anda dapat mengurutkan array kemudian melakukan pencarian biner pada array yang baru diurutkan.
Thomas Owens
1
@ Thomas: Saya setuju. Atau Anda bisa menambahkan semuanya ke TreeSet; kompleksitas yang sama. Saya akan menggunakan Array jika tidak berubah (mungkin menyimpan sedikit memori lokal karena referensi terletak berdekatan meskipun string tidak). Saya akan menggunakan set jika ini akan berubah seiring waktu.
Uri
49
Untuk apa nilainya saya menjalankan tes membandingkan 3 saran untuk kecepatan. Saya menghasilkan bilangan bulat acak, mengubahnya menjadi String dan menambahkannya ke sebuah array. Saya kemudian mencari angka / string tertinggi, yang akan menjadi skenario terburuk untukasList().contains() .
Saat menggunakan ukuran array 10K, hasilnya adalah:
Jadi jika array dibuat dalam urutan, pencarian biner adalah yang tercepat, jika tidak maka asList().containsakan menjadi cara untuk pergi. Jika Anda memiliki banyak pencarian, mungkin ada baiknya menyortir array sehingga Anda dapat menggunakan pencarian biner. Itu semua tergantung pada aplikasi Anda.
Saya pikir itu adalah hasil yang diharapkan kebanyakan orang. Ini adalah kode tes:
Saya tidak mengerti kode ini. Anda mengurutkan array 'string' dan menggunakan array yang sama (diurutkan) di kedua panggilan ke binarySearch. Bagaimana itu bisa menunjukkan apa pun kecuali optimasi runtime HotSpot? Sama dengan panggilan asList.contains. Anda membuat daftar dari array yang diurutkan dan kemudian memuatnya dengan nilai tertinggi. Tentu saja itu akan memakan waktu. Apa arti dari tes ini? Belum lagi menjadi microbenchmark yang ditulis dengan tidak benar
Erik
Juga, karena pencarian biner hanya dapat diterapkan pada set yang disortir, sortir dan pencarian adalah satu-satunya cara yang mungkin untuk menggunakan pencarian biner.
Erik
Penyortiran mungkin telah dilakukan karena sejumlah alasan lain, misalnya, penyortiran dapat diurutkan berdasarkan init dan tidak pernah berubah. Ada gunanya menguji waktu pencarian sendiri. Namun di mana ini jatuh menjadi contoh mikrobenchmarking kurang dari bintang. Microbenchmark terkenal sulit untuk diperbaiki di Jawa dan harus misalnya menyertakan mengeksekusi kode tes cukup untuk mendapatkan optimasi hotspot sebelum menjalankan tes yang sebenarnya, apalagi menjalankan kode tes yang sebenarnya lebih dari SEKALI dengan SEKALI dengan timer. Contoh perangkap
Thor84no
7
Tes ini cacat karena menjalankan semua 3 tes dalam contoh JVM yang sama . Tes selanjutnya dapat mengambil manfaat dari yang sebelumnya melakukan pemanasan cache, JIT, dll
Steve Kuo
4
Tes ini sebenarnya sama sekali tidak berhubungan. Sortir & Pencarian adalah kompleksitas linearitmik (n * log (n)), pencarian biner adalah logaritmik dan ArrayUtils.contains jelas linier. Tidak ada gunanya membandingkan solusi ini karena mereka berada di kelas kompleksitas yang sama sekali berbeda.
dragn
37
Daripada menggunakan sintaks inisialisasi array cepat juga, Anda bisa langsung menginisialisasi sebagai Daftar dengan cara yang sama menggunakan metode Arrays.asList, misalnya:
Untuk juga menambahkan, anyMatchJavaDoc menyatakan itu "...May not evaluate the predicate on all elements if not necessary for determining the result.", jadi mungkin tidak perlu melanjutkan pemrosesan setelah menemukan kecocokan.
mkobit
28
Anda bisa menggunakan kelas Array untuk melakukan pencarian biner untuk nilai. Jika array Anda tidak diurutkan, Anda harus menggunakan fungsi sortir di kelas yang sama untuk mengurutkan array, lalu cari.
Anda dapat menggunakan fungsi sortir di kelas yang sama untuk mencapai itu ... Saya harus menambahkannya ke jawaban saya.
Thomas Owens
1
Mungkin akan lebih mahal daripada pendekatan asList (). Berisi (), kemudian, saya pikir. Kecuali jika Anda perlu melakukan itu, periksa sangat sering (tetapi jika itu hanya daftar nilai statis yang bisa disortir, mulailah bersikap adil).
Joey
Benar. Ada banyak variabel yang paling efektif. Ada baiknya memiliki opsi.
Menyortir seluruh array untuk keperluan pencarian mahal. Kita dapat menggunakan waktu CPU yang sama untuk pencarian liner itu sendiri. Saya lebih suka pencarian biner pada koleksi yang sudah dibangun dalam urutan diurutkan sebelumnya.
arunwithasmile
17
ObStupidAnswer (tapi saya pikir ada pelajaran di sini di suatu tempat):
Melempar pengecualian tampaknya berat tetapi ini akan menjadi cara baru menguji nilai jika berhasil. Kelemahannya adalah bahwa enum harus ditentukan sebelumnya.
James P.
13
Sebenarnya, jika Anda menggunakan HashSet <String> seperti yang diusulkan oleh Tom Hawtin, Anda tidak perlu khawatir tentang penyortiran, dan kecepatan Anda sama dengan pencarian biner pada array yang dipilih, mungkin bahkan lebih cepat.
Itu semua tergantung pada bagaimana kode Anda diatur, tentu saja, tetapi dari tempat saya berdiri, urutannya adalah:
Keanggotaan HashSet harus O (1) dan pencarian biner pada koleksi yang diurutkan adalah O (log n).
Skylar Saveland
11
Jika Anda memiliki perpustakaan koleksi google, jawaban Tom dapat disederhanakan banyak dengan menggunakan ImmutableSet (http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/ImmutableSet.html)
Ini benar-benar menghilangkan banyak kekacauan dari inisialisasi yang diusulkan
Set<String> set =newHashSet<String>(Arrays.asList(arr));return set.contains(targetValue);
Kode di atas berfungsi, tetapi tidak perlu mengonversi daftar untuk ditetapkan terlebih dahulu. Mengonversi daftar ke perangkat memerlukan waktu ekstra. Ini bisa sesederhana:
Untuk array dengan panjang terbatas gunakan yang berikut (seperti yang diberikan oleh camickr ). Ini lambat untuk pemeriksaan berulang, terutama untuk array yang lebih panjang (pencarian linear).
Arrays.asList(...).contains(...)
Untuk kinerja cepat jika Anda berulang kali mengecek elemen yang lebih besar
Array adalah struktur yang salah. Gunakan a TreeSetdan tambahkan setiap elemen ke dalamnya. Ini memilah elemen dan memiliki exist()metode cepat (pencarian biner).
Jika elemen menerapkan Comparable& Anda ingin TreeSetdiurutkan sesuai:
TreeSet myElements =newTreeSet();// Do this for each element (implementing *Comparable*)
myElements.add(nextElement);// *Alternatively*, if an array is forceably provided from other code:
myElements.addAll(Arrays.asList(myArray));
Jika tidak, gunakan milik Anda sendiri Comparator:
classMyComparatorimplementsComparator<ElementClass>{int compareTo(ElementClass element1;ElementClass element2){// Your comparison of elements// Should be consistent with object equality}boolean equals(Object otherComparator){// Your equality of comparators}}// construct TreeSet with the comparatorTreeSet myElements =newTreeSet(newMyComparator());// Do this for each element (implementing *Comparable*)
myElements.add(nextElement);
Imbalannya: periksa keberadaan beberapa elemen:
// Fast binary search through sorted elements (performance ~ log(size)):boolean containsElement = myElements.exists(someElement);
Kenapa repot-repot TreeSet? HashSetlebih cepat (O (1)) dan tidak perlu dipesan.
Sean Owen
4
Coba ini:
ArrayList<Integer> arrlist =newArrayList<Integer>(8);// use add() method to add elements in the list
arrlist.add(20);
arrlist.add(25);
arrlist.add(10);
arrlist.add(15);boolean retval = arrlist.contains(10);if(retval ==true){System.out.println("10 is contained in the list");}else{System.out.println("10 is not contained in the list");}
Gunakan yang berikut ini ( contains()metode ada ArrayUtils.in()dalam kode ini):
ObjectUtils.java
publicclassObjectUtils{/**
* A null safe method to detect if two objects are equal.
* @param object1
* @param object2
* @return true if either both objects are null, or equal, else returns false.
*/publicstaticboolean equals(Object object1,Object object2){return object1==null? object2==null: object1.equals(object2);}}
ArrayUtils.java
publicclassArrayUtils{/**
* Find the index of of an object is in given array, starting from given inclusive index.
* @param ts Array to be searched in.
* @param t Object to be searched.
* @param start The index from where the search must start.
* @return Index of the given object in the array if it is there, else -1.
*/publicstatic<T>int indexOf(final T[] ts,final T t,int start){for(int i = start; i < ts.length;++i)if(ObjectUtils.equals(ts[i], t))return i;return-1;}/**
* Find the index of of an object is in given array, starting from 0;
* @param ts Array to be searched in.
* @param t Object to be searched.
* @return indexOf(ts, t, 0)
*/publicstatic<T>int indexOf(final T[] ts,final T t){return indexOf(ts, t,0);}/**
* Detect if the given object is in the given array.
* @param ts Array to be searched in.
* @param t Object to be searched.
* @return If indexOf(ts, t) is greater than -1.
*/publicstatic<T>boolean in(final T[] ts,final T t){return indexOf(ts, t)>-1;}}
Seperti yang Anda lihat dalam kode di atas, bahwa ada metode utilitas lain ObjectUtils.equals()dan ArrayUtils.indexOf(), yang digunakan di tempat lain juga.
Saya sangat terlambat untuk bergabung dalam diskusi ini, tetapi karena pendekatan saya dalam memecahkan masalah ini, ketika saya menghadapinya beberapa tahun yang lalu, sedikit berbeda dari jawaban lain yang sudah diposting di sini, saya memposting solusi yang saya gunakan pada waktu itu, di sini, kalau-kalau ada yang merasa berguna.
Abhishek Oza
3
Periksa ini
String[] VALUES =newString[]{"AB","BC","CD","AE"};String s;for(int i=0; i< VALUES.length ; i++){if( VALUES[i].equals(s)){// do your stuff}else{//do your stuff}}
Ini tidak berfungsi - itu akan masuk elseuntuk setiap item yang tidak cocok (jadi jika Anda mencari "AB" dalam array itu, ia akan pergi ke sana 3 kali, karena 3 dari nilai tidak "AB ").
Bernhard Barker
3
Arrays.asList () -> lalu memanggil metode contain () akan selalu berfungsi, tetapi algoritma pencarian jauh lebih baik karena Anda tidak perlu membuat pembungkus daftar ringan di sekitar array, yang dilakukan oleh Arrays.asList () .
publicboolean findString(String[] strings,String desired){for(String str : strings){if(desired.equals(str)){returntrue;}}returnfalse;//if we get here… there is no desired String, return false.}
Array.BinarySearchdan Array.FindIndex. Metode NET dan tidak ada di Jawa.
ataylor
@ ataylor ada Arrays.binarySearch di java. Tapi kau benar, tidak ada Array.findIndex
mente
Perlu dicatat:The array must be sorted prior to making this call. If it is not sorted, the results are undefined.
Dorian Gray
1
Buat boolean awalnya disetel ke false. Jalankan perulangan untuk memeriksa setiap nilai dalam array dan bandingkan dengan nilai yang Anda periksa. Jika Anda mendapatkan kecocokan, atur boolean menjadi true dan hentikan perulangan. Kemudian tegaskan bahwa boolean itu benar.
Karena saya berurusan dengan Java tingkat rendah menggunakan byte dan byte tipe primitif, yang terbaik sejauh ini saya dapatkan dari byte-java https://github.com/patrickfav/bytes-java tampaknya merupakan karya yang bagus
Jawaban:
Peringatan: ini tidak berfungsi untuk array primitif (lihat komentar).
Sejak java-8 Anda sekarang dapat menggunakan Streaming.
Untuk memeriksa apakah array
int
,double
ataulong
berisi penggunaan nilaiIntStream
,DoubleStream
atauLongStream
masing - masing.Contoh
sumber
ArrayList
, tapi tidakjava.util.ArrayList
seperti yang Anda harapkan, kelas nyata yang dikembalikan:java.util.Arrays.ArrayList<E>
didefinisikan sebagai:public class java.util.Arrays {private static class ArrayList<E> ... {}}
.Pembaruan ringkas untuk Java SE 9
Array referensi buruk. Untuk kasus ini kita mengejar set. Sejak Java SE 9 kita miliki
Set.of
."Diberikan String s, apakah ada cara yang baik untuk menguji apakah VALUES berisi s?"
O (1).
The jenis yang tepat , berubah , O (1) dan ringkas . Cantik.*
Rincian jawaban asli
Hanya untuk menghapus kode untuk memulai. Kami telah (dikoreksi):
Ini adalah statik yang bisa berubah yang FindBugs akan bilang sangat nakal. Jangan modifikasi statika dan jangan izinkan kode lain melakukannya juga. Paling tidak absolut, bidang harus pribadi:
(Catatan, Anda dapat benar-benar menjatuhkan
new String[];
bit.)Array referensi masih buruk dan kami ingin satu set:
(Orang paranoid, seperti saya, mungkin merasa lebih nyaman jika ini dibungkus
Collections.unmodifiableSet
- itu bahkan dapat dipublikasikan).(* Untuk sedikit lebih pada merek, API koleksi diperkirakan masih kehilangan tipe koleksi yang tidak berubah dan sintaksisnya masih terlalu bertele-tele, untuk selera saya.)
sumber
Arrays.asList
)?TreeSet
akan menjadiO(log n)
.HashSet
s diskalakan sedemikian rupa sehingga jumlah rata-rata elemen dalam ember kira-kira konstan. Setidaknya untuk array hingga 2 ^ 30. Mungkin ada pengaruh dari, katakanlah, cache perangkat keras yang diabaikan oleh analisis big-O. Juga mengasumsikan fungsi hash bekerja secara efektif.Anda dapat menggunakan
ArrayUtils.contains
dari Apache Commons Langpublic static boolean contains(Object[] array, Object objectToFind)
Perhatikan bahwa metode ini kembali
false
jika array yang diteruskan adalahnull
.Ada juga metode yang tersedia untuk semua jenis array primitif.
Contoh:
sumber
Cukup dengan menerapkannya dengan tangan:
Perbaikan:
The
v != null
kondisi konstan dalam metode. Itu selalu mengevaluasi ke nilai Boolean yang sama selama pemanggilan metode. Jadi jika inputnyaarray
besar, lebih efisien untuk mengevaluasi kondisi ini hanya sekali, dan kita bisa menggunakan kondisi yang disederhanakan / lebih cepat di dalamfor
loop berdasarkan hasil.contains()
Metode yang ditingkatkan :sumber
Collection.contains(Object)
Arrays
danArrayList
ternyata ini belum tentu lebih cepat daripada menggunakan versiArrays.asList(...).contains(...)
. Overhead membuatArrayList
sangat kecil, danArrayList.contains()
menggunakan loop cerdas (sebenarnya menggunakan dua loop berbeda) daripada yang ditunjukkan di atas (JDK 7).Empat Cara Berbeda untuk Memeriksa Jika Array Mengandung Nilai
1) Menggunakan Daftar:
2) Menggunakan Set:
3) Menggunakan loop sederhana:
4) Menggunakan Arrays.binarySearch ():
Kode di bawah ini salah, tercantum di sini untuk kelengkapan. binarySearch () HANYA dapat digunakan pada array yang diurutkan. Anda akan menemukan hasilnya aneh di bawah ini. Ini adalah opsi terbaik ketika array diurutkan.
Contoh cepat:
sumber
(a >= 0)
benar, cukup periksa dokumen , mereka mengatakan "Perhatikan bahwa ini menjamin bahwa nilai pengembalian akan> = 0 jika dan hanya jika kunci ditemukan".Jika array tidak diurutkan, Anda harus mengulang semuanya dan membuat panggilan untuk menyamakan masing-masing.
Jika array diurutkan, Anda dapat melakukan pencarian biner, ada satu di kelas Array .
Secara umum, jika Anda akan melakukan banyak pemeriksaan keanggotaan, Anda mungkin ingin menyimpan semuanya dalam Set, bukan dalam array.
sumber
Untuk apa nilainya saya menjalankan tes membandingkan 3 saran untuk kecepatan. Saya menghasilkan bilangan bulat acak, mengubahnya menjadi String dan menambahkannya ke sebuah array. Saya kemudian mencari angka / string tertinggi, yang akan menjadi skenario terburuk untuk
asList().contains()
.Saat menggunakan ukuran array 10K, hasilnya adalah:
Saat menggunakan array 100K, hasilnya adalah:
Jadi jika array dibuat dalam urutan, pencarian biner adalah yang tercepat, jika tidak maka
asList().contains
akan menjadi cara untuk pergi. Jika Anda memiliki banyak pencarian, mungkin ada baiknya menyortir array sehingga Anda dapat menggunakan pencarian biner. Itu semua tergantung pada aplikasi Anda.Saya pikir itu adalah hasil yang diharapkan kebanyakan orang. Ini adalah kode tes:
sumber
Daripada menggunakan sintaks inisialisasi array cepat juga, Anda bisa langsung menginisialisasi sebagai Daftar dengan cara yang sama menggunakan metode Arrays.asList, misalnya:
Maka Anda dapat melakukan (seperti di atas):
sumber
Dengan Java 8 Anda dapat membuat aliran dan memeriksa apakah ada entri dalam aliran yang cocok
"s"
:Atau sebagai metode umum:
sumber
anyMatch
JavaDoc menyatakan itu"...May not evaluate the predicate on all elements if not necessary for determining the result."
, jadi mungkin tidak perlu melanjutkan pemrosesan setelah menemukan kecocokan.Anda bisa menggunakan kelas Array untuk melakukan pencarian biner untuk nilai. Jika array Anda tidak diurutkan, Anda harus menggunakan fungsi sortir di kelas yang sama untuk mengurutkan array, lalu cari.
sumber
ObStupidAnswer (tapi saya pikir ada pelajaran di sini di suatu tempat):
sumber
Sebenarnya, jika Anda menggunakan HashSet <String> seperti yang diusulkan oleh Tom Hawtin, Anda tidak perlu khawatir tentang penyortiran, dan kecepatan Anda sama dengan pencarian biner pada array yang dipilih, mungkin bahkan lebih cepat.
Itu semua tergantung pada bagaimana kode Anda diatur, tentu saja, tetapi dari tempat saya berdiri, urutannya adalah:
Pada array yang tidak disortir :
Pada array yang diurutkan:
Jadi, HashSet untuk menang.
sumber
Jika Anda memiliki perpustakaan koleksi google, jawaban Tom dapat disederhanakan banyak dengan menggunakan ImmutableSet (http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/ImmutableSet.html)
Ini benar-benar menghilangkan banyak kekacauan dari inisialisasi yang diusulkan
sumber
Satu solusi yang mungkin:
sumber
Pengembang sering melakukan:
Kode di atas berfungsi, tetapi tidak perlu mengonversi daftar untuk ditetapkan terlebih dahulu. Mengonversi daftar ke perangkat memerlukan waktu ekstra. Ini bisa sesederhana:
atau
Yang pertama lebih mudah dibaca daripada yang kedua.
sumber
Menggunakan loop sederhana adalah cara paling efisien untuk melakukan ini.
Atas perkenan Programcreek
sumber
Di Java 8 gunakan Streams.
sumber
Untuk array dengan panjang terbatas gunakan yang berikut (seperti yang diberikan oleh camickr ). Ini lambat untuk pemeriksaan berulang, terutama untuk array yang lebih panjang (pencarian linear).
Untuk kinerja cepat jika Anda berulang kali mengecek elemen yang lebih besar
Array adalah struktur yang salah. Gunakan a
TreeSet
dan tambahkan setiap elemen ke dalamnya. Ini memilah elemen dan memilikiexist()
metode cepat (pencarian biner).Jika elemen menerapkan
Comparable
& Anda inginTreeSet
diurutkan sesuai:ElementClass.compareTo()
Metode harus kompatibel denganElementClass.equals()
: lihat Triad tidak muncul untuk bertarung? (Java Atur item yang hilang)Jika tidak, gunakan milik Anda sendiri
Comparator
:Imbalannya: periksa keberadaan beberapa elemen:
sumber
TreeSet
?HashSet
lebih cepat (O (1)) dan tidak perlu dipesan.Coba ini:
sumber
Gunakan yang berikut ini (
contains()
metode adaArrayUtils.in()
dalam kode ini):ObjectUtils.java
ArrayUtils.java
Seperti yang Anda lihat dalam kode di atas, bahwa ada metode utilitas lain
ObjectUtils.equals()
danArrayUtils.indexOf()
, yang digunakan di tempat lain juga.sumber
Periksa ini
sumber
else
untuk setiap item yang tidak cocok (jadi jika Anda mencari "AB" dalam array itu, ia akan pergi ke sana 3 kali, karena 3 dari nilai tidak "AB ").Arrays.asList () -> lalu memanggil metode contain () akan selalu berfungsi, tetapi algoritma pencarian jauh lebih baik karena Anda tidak perlu membuat pembungkus daftar ringan di sekitar array, yang dilakukan oleh Arrays.asList () .
sumber
Arrays.asList
bukan O (n). Itu hanya pembungkus ringan. Lihatlah implementasinya.Jika Anda tidak ingin menjadi case sensitif
sumber
Gunakan
Array.BinarySearch(array,obj)
untuk menemukan objek yang diberikan dalam array atau tidak.Contoh:
false - tidak ada
sumber
Array.BinarySearch
danArray.FindIndex
. Metode NET dan tidak ada di Jawa.The array must be sorted prior to making this call. If it is not sorted, the results are undefined.
Buat boolean awalnya disetel ke false. Jalankan perulangan untuk memeriksa setiap nilai dalam array dan bandingkan dengan nilai yang Anda periksa. Jika Anda mendapatkan kecocokan, atur boolean menjadi true dan hentikan perulangan. Kemudian tegaskan bahwa boolean itu benar.
sumber
Coba gunakan metode tes predikat Java 8
Ini adalah contoh lengkapnya.
http://mytechnologythought.blogspot.com/2019/10/java-8-predicate-test-method-example.html
https://github.com/VipulGulhane1/java8/blob/master/Test.java
sumber
penggunaan a
Spliterator
mencegah generasi a yang tidak perluList
found == true
jikasearch
terkandung dalam arrayini tidak bekerja untuk array primitif
sumber
Karena saya berurusan dengan Java tingkat rendah menggunakan byte dan byte tipe primitif, yang terbaik sejauh ini saya dapatkan dari byte-java https://github.com/patrickfav/bytes-java tampaknya merupakan karya yang bagus
sumber
Anda dapat memeriksanya dengan dua metode
A) Dengan mengubah array menjadi string dan kemudian memeriksa string yang diperlukan dengan metode .contains
B) ini adalah metode yang lebih efisien
sumber