Bagaimana cara menentukan apakah array berisi nilai tertentu di Java?


2279

Saya memiliki String[]nilai-nilai seperti:

public static final String[] VALUES = new String[] {"AB","BC","CD","AE"};

Mengingat String s, apakah ada cara pengujian yang baik apakah VALUESmengandung s?


5
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.
Bill K

1
Jika Anda menggunakan Apache Commons, maka org.apache.commons.lang.ArrayUtils.contains () melakukan ini untuk Anda.
Tn. Boy

34
@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 Anda sekarang dapat menggunakan Streaming.

String[] values = {"AB","BC","CD","AE"};
boolean contains = Arrays.stream(values).anyMatch("s"::equals);

Untuk memeriksa apakah array int, doubleatau longberisi penggunaan nilai IntStream, DoubleStreamatau LongStreammasing - masing.

Contoh

int[] a = {1,2,3,4};
boolean contains = IntStream.of(a).anyMatch(x -> x == 4);

87
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.

private static final Set<String> VALUES = Set.of(
    "AB","BC","CD","AE"
);

"Diberikan String s, apakah ada cara yang baik untuk menguji apakah VALUES berisi s?"

VALUES.contains(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):

public static final String[] VALUES = new String[] {"AB","BC","CD","AE"};

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:

private static final String[] VALUES = new String[] {"AB","BC","CD","AE"};

(Catatan, Anda dapat benar-benar menjatuhkan new String[];bit.)

Array referensi masih buruk dan kami ingin satu set:

private static final Set<String> VALUES = new HashSet<String>(Arrays.asList(
     new String[] {"AB","BC","CD","AE"}
));

(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.)


184
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.
Tom Hawtin - tackline

206

Anda dapat menggunakan ArrayUtils.containsdari Apache Commons Lang

public static boolean contains(Object[] array, Object objectToFind)

Perhatikan bahwa metode ini kembali falsejika array yang diteruskan adalah null.

Ada juga metode yang tersedia untuk semua jenis array primitif.

Contoh:

String[] fieldsToInclude = { "id", "name", "location" };

if ( ArrayUtils.contains( fieldsToInclude, "id" ) ) {
    // Do some stuff.
}

4
@ max4ever saya setuju, tapi ini masih lebih baik daripada "menggulung sendiri" dan lebih mudah dibaca daripada cara java mentah.
Jason


38
@ 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:

public static <T> boolean contains(final T[] array, final T v) {
    for (final T e : array)
        if (e == v || v != null && v.equals(e))
            return true;

    return false;
}

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 :

public static <T> boolean contains2(final T[] array, final T v) {
    if (v == null) {
        for (final T e : array)
            if (e == null)
                return true;
    } 
    else {
        for (final T e : array)
            if (e == v || v.equals(e))
                return true;
    }

    return false;
}

9
@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).
Axel

72

Empat Cara Berbeda untuk Memeriksa Jika Array Mengandung Nilai

1) Menggunakan Daftar:

public static boolean useList(String[] arr, String targetValue) {
    return Arrays.asList(arr).contains(targetValue);
}

2) Menggunakan Set:

public static boolean useSet(String[] arr, String targetValue) {
    Set<String> set = new HashSet<String>(Arrays.asList(arr));
    return set.contains(targetValue);
}

3) Menggunakan loop sederhana:

public static boolean useLoop(String[] arr, String targetValue) {
    for (String s: arr) {
        if (s.equals(targetValue))
            return true;
    }
    return false;
}

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.

public static boolean binarySearch(String[] arr, String targetValue) {  
            int a = Arrays.binarySearch(arr, targetValue);
            return a > 0;
        }

Contoh cepat:

String testValue="test";
String newValueNotInList="newValue";
String[] valueArray = { "this", "is", "java" , "test" };
Arrays.asList(valueArray).contains(testValue); // returns true
Arrays.asList(valueArray).contains(newValueNotInList); // returns false

5
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.


1
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:

Sortir & Cari: 15
Pencarian Biner: 0
asList.contains: 0

Saat menggunakan array 100K, hasilnya adalah:

Sortir & Cari: 156
Pencarian Biner: 0
asList.contains: 32

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:

import java.util.*;

public class Test
{
    public static void main(String args[])
    {
        long start = 0;
        int size = 100000;
        String[] strings = new String[size];
        Random random = new Random();


        for (int i = 0; i < size; i++)
            strings[i] = "" + random.nextInt( size );

        start = System.currentTimeMillis();
        Arrays.sort(strings);
        System.out.println(Arrays.binarySearch(strings, "" + (size - 1) ));
        System.out.println("Sort & Search : " + (System.currentTimeMillis() - start));

        start = System.currentTimeMillis();
        System.out.println(Arrays.binarySearch(strings, "" + (size - 1) ));
        System.out.println("Search        : " + (System.currentTimeMillis() - start));

        start = System.currentTimeMillis();
        System.out.println(Arrays.asList(strings).contains( "" + (size - 1) ));
        System.out.println("Contains      : " + (System.currentTimeMillis() - start));
    }
}

6
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:

public static final List<String> STRINGS = Arrays.asList("firstString", "secondString" ...., "lastString");

Maka Anda dapat melakukan (seperti di atas):

STRINGS.contains("the string you want to find");

36

Dengan Java 8 Anda dapat membuat aliran dan memeriksa apakah ada entri dalam aliran yang cocok "s":

String[] values = {"AB","BC","CD","AE"};
boolean sInArray = Arrays.stream(values).anyMatch("s"::equals);

Atau sebagai metode umum:

public static <T> boolean arrayContains(T[] array, T value) {
    return Arrays.stream(array).anyMatch(value::equals);
}

3
Perlu juga dicatat spesialisasi primitif.
skiwi

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.
Thomas Owens

Beberapa kode yang melakukan ini di sini: stackoverflow.com/a/48242328/9131078
OOBalance

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):

enum Values {
    AB, BC, CD, AE
}

try {
    Values.valueOf(s);
    return true;
} catch (IllegalArgumentException exc) {
    return false;
}

1
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:

Pada array yang tidak disortir :

  1. HashSet
  2. asList
  3. sortir & biner

Pada array yang diurutkan:

  1. HashSet
  2. Biner
  3. asList

Jadi, HashSet untuk menang.


2
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

private static final Set<String> VALUES =  ImmutableSet.of("AB","BC","CD","AE");

10

Satu solusi yang mungkin:

import java.util.Arrays;
import java.util.List;

public class ArrayContainsElement {
  public static final List<String> VALUES = Arrays.asList("AB", "BC", "CD", "AE");

  public static void main(String args[]) {

      if (VALUES.contains("AB")) {
          System.out.println("Contains");
      } else {
          System.out.println("Not contains");
      }
  }
}

8

Pengembang sering melakukan:

Set<String> set = new HashSet<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:

Arrays.asList(arr).contains(targetValue);

atau

   for(String s: arr){
        if(s.equals(targetValue))
            return true;
    }

return false;

Yang pertama lebih mudah dibaca daripada yang kedua.


7

Menggunakan loop sederhana adalah cara paling efisien untuk melakukan ini.

boolean useLoop(String[] arr, String targetValue) {
    for(String s: arr){
        if(s.equals(targetValue))
            return true;
    }
    return false;
}

Atas perkenan Programcreek


Ini akan melempar pengecualian penunjuk nol jika array berisi referensi nol sebelum nilai target.
Samuel Edwin Ward

1
pernyataan if harus: if (targetValue.equals (s)) karena String sama dengan memiliki instance dari pemeriksa.
TheArchon

gunakan Objects.equals (obj1, obj2) sebagai gantinya aman nol.
trilogi

7

Di Java 8 gunakan Streams.

List<String> myList =
Arrays.asList("a1", "a2", "b1", "c2", "c1");

myList
.stream()
.filter(s -> s.startsWith("c"))
.map(String::toUpperCase)
.sorted()
.forEach(System.out::println);

7
Apakah ada manfaat dengan pendekatan ini?
Johannes Stadler

1
Itu tidak menjawab pertanyaan.
Florian F

5
  1. 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(...)
  2. 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:

      ElementClass.compareTo()Metode harus kompatibel dengan ElementClass.equals(): lihat Triad tidak muncul untuk bertarung? (Java Atur item yang hilang)

      TreeSet myElements = new TreeSet();
      
      // 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:

      class MyComparator implements Comparator<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 comparator
      TreeSet myElements = new TreeSet(new MyComparator());
      
      // 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);

4
Kenapa repot-repot TreeSet? HashSetlebih cepat (O (1)) dan tidak perlu dipesan.
Sean Owen

4

Coba ini:

ArrayList<Integer> arrlist = new ArrayList<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");
}

4

Gunakan yang berikut ini ( contains()metode ada ArrayUtils.in()dalam kode ini):

ObjectUtils.java

public class ObjectUtils{

    /**
     * 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.
     */
    public static boolean equals(Object object1, Object object2){
        return object1==null ? object2==null : object1.equals(object2);
    }

}

ArrayUtils.java

public class ArrayUtils{

    /**
     * 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.
     */
    public static <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)
     */
    public static <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.
     */
    public static <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 = new String[] {"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
    }
}

1
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 () .

public boolean findString(String[] strings, String desired){
   for (String str : strings){
       if (desired.equals(str)) {
           return true;
       }
   }
   return false; //if we get here… there is no desired String, return false.
}

Arrays.asListbukan O (n). Itu hanya pembungkus ringan. Lihatlah implementasinya.
Patrick Parker

3

Jika Anda tidak ingin menjadi case sensitif

Arrays.stream(VALUES).anyMatch(s::equalsIgnoreCase);

2

Gunakan Array.BinarySearch(array,obj)untuk menemukan objek yang diberikan dalam array atau tidak.

Contoh:

if (Array.BinarySearch(str, i) > -1)`  true --exists

false - tidak ada


4
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.


1

Coba gunakan metode tes predikat Java 8

Ini adalah contoh lengkapnya.

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;
public class Test {
 public static final List<String> VALUES = Arrays.asList("AA", "AB", "BC", "CD", "AE");

 public static void main(String args[]) {
  Predicate<String> containsLetterA = VALUES -> VALUES.contains("AB");
  for (String i : VALUES) {

   System.out.println(containsLetterA.test(i));
  } 
 }
}

http://mytechnologythought.blogspot.com/2019/10/java-8-predicate-test-method-example.html

https://github.com/VipulGulhane1/java8/blob/master/Test.java


0

penggunaan a Spliterator mencegah generasi a yang tidak perlu List

boolean found = false;  // class variable

String search = "AB";
Spliterator<String> spl = Arrays.spliterator( VALUES, 0, VALUES.length );
while( (! found) && spl.tryAdvance(o -> found = o.equals( search )) );

found == truejika searchterkandung dalam array


ini tidak bekerja untuk array primitif

public static final int[] VALUES = new int[] {1, 2, 3, 4};
boolean found = false;  // class variable

int search = 2;
Spliterator<Integer> spl = Arrays.spliterator( VALUES, 0, VALUES.length );


-2

Anda dapat memeriksanya dengan dua metode

A) Dengan mengubah array menjadi string dan kemudian memeriksa string yang diperlukan dengan metode .contains

 String a=Arrays.toString(VALUES);
    System.out.println(a.contains("AB"));
    System.out.println(a.contains("BC"));
    System.out.println(a.contains("CD"));
    System.out.println(a.contains("AE"));

B) ini adalah metode yang lebih efisien

 Scanner s=new Scanner(System.in);


   String u=s.next();
   boolean d=true;
    for(int i=0;i<VAL.length;i++)
    {
        if(VAL[i].equals(u)==d)
            System.out.println(VAL[i] +" "+u+VAL[i].equals(u));  

    }

1
Konversi string sangat tidak efisien dan solusinya salah, misal berisi (",") akan mengembalikan true.
Atuos
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.