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.


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);
}

64

Anda bisa menggunakan ArrayUtils.containsdari Apache Commons Lang library.

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

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.


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


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)


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


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

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); 
}

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

0

ini bekerja di java 8

public static boolean contains(final int[] array, final int key)
{
return Arrays.stream(array).anyMatch(n->n==key);
}

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

-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;
}
}

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


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;

              }


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