Java, Simplified memeriksa apakah int array berisi int

95

Pada dasarnya teman saya telah mengatakan bahwa saya dapat membuat kode saya lebih pendek dengan menggunakan cara yang berbeda untuk memeriksa apakah sebuah array int berisi int, meskipun dia tidak akan memberi tahu saya apa itu: P.

Arus:

public boolean contains(final int[] array, final int key) {
    for (final int i : array) {
        if (i == key) {
            return true;
        }
    }
    return false;
}

Saya juga mencoba ini, meskipun selalu mengembalikan false karena beberapa alasan.

public boolean contains(final int[] array, final int key) {
    return Arrays.asList(array).contains(key);
}

Adakah yang dapat membantu saya?

Terima kasih.

Caleb
sumber
8
Panggilan Arrays.asList (...) Anda mengambil vararg, yang akan membungkus sejumlah argumen yang mungkin Anda masukkan ke dalam Daftar. Dalam kasus Anda, Anda mendapatkan daftar array dengan satu elemen, dan daftar ini jelas tidak berisi int.
sarcan
Komentar Anda berarti apa sekarang?
sarcan
periksa Hashsetjawaban mekanisme pengadilan ulang berdasarkan. Itu cara tercepat.
Amit Deshpande
Saya tidak melihat ada gunanya membuat kode asli Anda lebih pendek karena argumen Anda adalah array primitif dan kode Anda sangat jelas dan langsung. ArrayListimplementasi melakukan hal yang sama.
Genzer
Saya tidak akan membuat kode Anda lebih pendek. (1) arraylist melakukan hal yang sama seperti yang Anda lakukan. (2) - hal yang lebih penting adalah kode yang dipersingkat menggunakan Arrays.asList membuat objek baru, yang dapat menjadi masalah dalam beberapa kode penting kinerja. Cuplikan kode pertama adalah hal terbaik yang dapat Anda lakukan.
Martin Podval

Jawaban:

39

Inilah solusi Java 8

public static boolean contains(final int[] arr, final int key) {
    return Arrays.stream(arr).anyMatch(i -> i == key);
}
TriCore
sumber
64

Anda bisa menggunakan ArrayUtils.containsdari Apache Commons Lang library.

public boolean contains(final int[] array, final int key) {     
    return ArrayUtils.contains(array, key);
}
Reimeus
sumber
1
Selama Anda menggunakan ArrayUtils, apakah ada alasan untuk tidak menggunakan ArrayUtils.contains
mjohnsonengr
2
Tidak ada alasan apa pun :)
Reimeus
20
Perlu dicatat bahwa itu ArrayUtils.contains()adalah bagian dari Apache Commons Langperpustakaan. Meskipun itu lib yang bagus, mungkin masih bukan ide yang baik untuk menambahkan dependensi eksternal hanya untuk memeriksa apakah array berisi elemen: D
Krzysiek
2
ArrayUtils adalah bagian dari masa lalu. Java 8+ dan Guava memiliki makanan yang luar biasa !!
TriCore
34

Itu karena Arrays.asList(array)pengembalian List<int[]>. arrayargumen diperlakukan sebagai satu nilai yang ingin Anda bungkus (Anda mendapatkan daftar array int), bukan sebagai vararg.

Perhatikan bahwa ini berfungsi dengan tipe objek (bukan primitif):

public boolean contains(final String[] array, final String key) {
    return Arrays.asList(array).contains(key);
}

atau bahkan:

public <T>  boolean contains(final T[] array, final T key) {
    return Arrays.asList(array).contains(key);
}

Tetapi Anda tidak dapat melakukannya List<int>dan autoboxing tidak berfungsi di sini.

Tomasz Nurkiewicz
sumber
1
Mengapa autoboxing tidak berfungsi, apakah karena sudah dinyatakan final?
subhashis
19

Jambu biji menawarkan metode tambahan untuk tipe primitif. Di antara mereka, metode berisi yang mengambil argumen yang sama seperti milik Anda.

public boolean contains(final int[] array, final int key) {
    return Ints.contains(array, key);
}

Anda mungkin juga mengimpor versi jambu biji secara statis.

Lihat Dijelaskan Primitif Jambu Biji

Evert
sumber
18

Cara berbeda:

public boolean contains(final int[] array, final int key) {  
     Arrays.sort(array);  
     return Arrays.binarySearch(array, key) >= 0;  
}  

Ini mengubah larik yang diteruskan. Anda akan memiliki opsi untuk menyalin larik dan mengerjakan larik asli, yaitu. int[] sorted = array.clone();
Tapi ini hanyalah contoh kode singkat. Runtime adalah O(NlogN)sementara cara AndaO(N)

Cratylus
sumber
30
Saya pikir saya akan terkejut jika containsmetode memodifikasi array saya.
Zong
@ZongLi: Ini hanya contoh untuk OP. Pembaruan OP jika kita nitpicking
Cratylus
5
Dari javadoc dari binarySearch (): "nilai yang dikembalikan akan> = 0 jika dan hanya jika kunci ditemukan." jadi Arrays.binarySearch (array, key)> = 0 harus dikembalikan!
icza
Tambahan: Nilai kembalian binarySearch () adalah (- (titik penyisipan) - 1) jika kunci tidak terdapat yang mungkin merupakan nilai selain -1.
icza
Ini tidak mungkin terjadi -1jika itu bermaksud menjadi kenyataan. "Titik penyisipan didefinisikan sebagai titik di mana kunci akan disisipkan ke dalam daftar: indeks elemen pertama lebih besar dari kunci, atau list.size () jika semua elemen dalam daftar kurang dari kunci yang ditentukan. ". Perlu dikatakan >= 0.
Brian
17

Aku tahu ini sudah sangat larut, tapi coba Integer[]saja int[].

Willy Wonka
sumber
Inilah solusinya.
atheesh27
1

1. penggunaan satu kali

List<T> list=Arrays.asList(...)
list.contains(...)

2. Gunakan HashSet untuk pertimbangan kinerja jika Anda menggunakan lebih dari sekali.

Set <T>set =new HashSet<T>(Arrays.asList(...));
set.contains(...)
Jaskey
sumber
1

Coba ini:

public static void arrayContains(){
    int myArray[]={2,2,5,4,8};

    int length=myArray.length;

    int toFind = 5;
    boolean found = false;

    for(int i = 0; i < length; i++) {
        if(myArray[i]==toFind) {
            found=true;
        }
    }

    System.out.println(myArray.length);
    System.out.println(found); 
}
Elavarasan S
sumber
1

Anda dapat mengonversi larik int primitif Anda ke dalam daftar larik Integer menggunakan kode Java 8 di bawah ini,

List<Integer> arrayElementsList = Arrays.stream(yourArray).boxed().collect(Collectors.toList());

Dan kemudian gunakan contains()metode untuk memeriksa apakah daftar berisi elemen tertentu,

boolean containsElement = arrayElementsList.contains(key);
Hetal Rachh
sumber
0

ini bekerja di java 8

public static boolean contains(final int[] array, final int key)
{
return Arrays.stream(array).anyMatch(n->n==key);
}
Farhad Baghirov
sumber
Ini harus segera kembali pada kecocokan pertama, sebagai gantinya ini akan tetap memindai semua item dalam larik, bahkan jika itu menemukan kecocokan. (Pertimbangkan berbagai item trilyun)
TriCore
Anda benar mencoba boolean statis publik ini berisi (array int [] akhir, kunci int akhir) {return Arrays.stream (array) .anyMatch (n-> n == key); }
Farhad Baghirov
Streaming Java 8 anyMatch adalah operasi sirkuit pendek dan tidak akan memindai semua item dalam array.
LordParsley
@LordParsley Tujuan kode di atas adalah memeriksa elemen dalam array, bukan memindai semua elemen array.
Farhad Baghirov
Maaf, saya melihat jawabannya telah diedit. Saya hanya mengulangi bahwa itu benar karena tidak perlu memindai semua jika menemukan satu bagian.
LordParsley
0

Anda dapat menggunakan java.util.Arrayskelas untuk mengubah array T[?]dalam List<T>objek dengan metode seperti contains:

Arrays.asList(int[] array).contains(int key);
Mourad El Aomari
sumber
-1

Bergantung pada seberapa besar array int Anda, Anda akan mendapatkan kinerja yang jauh lebih baik jika Anda menggunakan koleksi dan .containsdaripada melakukan iterasi pada array satu elemen pada satu waktu:

import static org.junit.Assert.assertTrue;
import java.util.HashSet;

import org.junit.Before;
import org.junit.Test;

public class IntLookupTest {

int numberOfInts = 500000;
int toFind = 200000;
int[] array;

HashSet<Integer> intSet;

@Before
public void initializeArrayAndSet() {
    array = new int[numberOfInts];
    intSet = new HashSet<Integer>();
    for(int i = 0; i < numberOfInts; i++) {
        array[i] = i;
        intSet.add(i);
    }
}

@Test
public void lookupUsingCollections() {
    assertTrue(intSet.contains(toFind));
}

@Test
public void iterateArray() {
    assertTrue(contains(array, toFind));

}

public boolean contains(final int[] array, final int key) {
    for (final int i : array) {
        if (i == key) {
            return true;
        }
    }
    return false;
}
}
Kaveh Ghahremani
sumber
-1

Solusi # 1

Karena pertanyaan awal hanya menginginkan solusi yang disederhanakan (dan bukan yang lebih cepat), berikut adalah solusi satu baris:

public boolean contains(int[] array, int key) {
    return Arrays.toString(array).matches(".*[\\[ ]" + key + "[\\],].*");
}

Penjelasan: Javadoc Arrays.toString()menyatakan hasil diapit tanda kurung siku dan elemen yang berdekatan dipisahkan oleh karakter "," (koma diikuti oleh spasi). Jadi kita bisa mengandalkan ini. Pertama kami mengonversi arraymenjadi string, dan kemudian kami memeriksa apakah keyada dalam string ini. Tentu saja kami tidak dapat menerima "sub-angka" (misalnya "1234" berisi "23"), jadi kami harus mencari pola di manakey diawali dengan kurung buka atau spasi, dan diikuti dengan tanda kurung tutup atau koma.

catatan: Pola regexp yang digunakan juga menangani angka negatif dengan benar (yang representasi stringnya dimulai dengan tanda minus).

Solusi # 2

Solusi ini sudah diposting tetapi berisi kesalahan, jadi saya memposting solusi yang benar:

public boolean contains(int[] array, int key) {
    Arrays.sort(array);
    return Arrays.binarySearch(array, key) >= 0;
}

Juga solusi ini memiliki efek samping: ia memodifikasi array(mengurutkannya).

icza
sumber
String handlig umumnya mahal, mengapa seseorang harus memperlakukan int sebagai string?
Denys Vitali
@DenysVitali Karena op sudah memiliki solusi yang berfungsi dan efisien, dan dia sedang mencari solusi yang lebih singkat . Dan ini lebih pendek. Pertanyaan ini bukan tentang kinerja.
icza
Saya seharusnya salah memahami pertanyaan itu, maaf telah bertanya
Denys Vitali
-5

Coba Integer.parseInt()lakukan ini .....

public boolean chkInt(final int[] array){
    int key = false;

    for (Integer i : array){


          try{

                   Integer.parseInt(i);
                   key = true;
                   return key;

             }catch(NumberFormatException ex){

                   key = false;

                   return key;

              }


     }
}
Kumar Vivek Mitra
sumber