Tentukan Jika Semua Elemen Sama dalam Senarai Java

1. Gambaran keseluruhan

Dalam tutorial ringkas ini, kita akan mengetahui cara menentukan sama ada semua elemen dalam Senarai sama.

Kami juga akan melihat kerumitan waktu setiap penyelesaian menggunakan notasi Big O, memberi kita senario terburuk.

2. Contoh

Katakan kita mempunyai 3 senarai berikut:

notAllEqualList = Arrays.asList("Jack", "James", "Sam", "James"); emptyList = Arrays.asList(); allEqualList = Arrays.asList("Jack", "Jack", "Jack", "Jack");

Tugas kami adalah untuk mencadangkan penyelesaian yang berbeza yang hanya berlaku untuk blankList dan allEqualList .

3. Gelung Asas

Pertama, benar bahawa untuk semua elemen sama, semuanya harus sama dengan elemen pertama. Mari manfaatkannya secara berterusan:

public boolean verifyAllEqualUsingALoop(List list) { for (String s : list) { if (!s.equals(list.get(0))) return false; } return true; }

Ini bagus kerana, walaupun kerumitan waktu adalah O (n) , ia mungkin keluar lebih awal.

4. HashSet

Kita juga boleh menggunakan HashSet kerana semua elemennya berbeza. Saya f kita menukar Senarai kepada HashSet dan saiz yang dihasilkan adalah kurang daripada atau sama dengan 1, maka kita tahu bahawa semua unsur-unsur dalam senarai adalah sama:

public boolean verifyAllEqualUsingHashSet(List list) { return new HashSet(list).size() <= 1; }

Menukar Senarai ke HashSet berharga O (n) masa sementara saiz panggilan memerlukan O (1) . Oleh itu, kita masih mempunyai kerumitan jumlah masa O (n) .

5. API Koleksi

Penyelesaian lain adalah dengan menggunakan kaedah frekuensi (Koleksi c, Objek o) dari Koleksi API. Kaedah ini mengembalikan bilangan elemen dalam Koleksi c yang sepadan dengan Objek o .

Jadi, jika hasil frekuensi sama dengan ukuran senarai, kita tahu bahawa semua elemennya sama:

public boolean verifyAllEqualUsingFrequency(List list)  return list.isEmpty() 

Sama seperti penyelesaian sebelumnya, kerumitan masa adalah O (n) kerana secara dalaman, Collections.frequency () menggunakan gelung asas.

6. Aliran

The Stream API di Jawa 8 memberikan kita lebih alternatif cara untuk mengesan sama ada semua item dalam senarai adalah sama.

6.1. berbeza ()

Mari kita lihat satu penyelesaian tertentu yang menggunakan kaedah yang berbeza () .

Untuk mengesahkan sama ada semua elemen dalam senarai sama, kami mengira elemen alirannya yang berbeza:

public boolean verifyAllEqualUsingStream(List list) { return list.stream() .distinct() .count() <= 1; }

Sekiranya kiraan aliran ini lebih kecil atau sama dengan 1, maka semua elemen sama dan kami kembali benar .

Jumlah kos operasi adalah O (n), yang merupakan masa yang diperlukan untuk melalui semua elemen aliran.

6.2. semuaPadan ()

Kaedah allMatch () API Stream menyediakan penyelesaian yang sempurna untuk menentukan sama ada semua elemen aliran ini sesuai dengan predikat yang disediakan:

public boolean verifyAllEqualAnotherUsingStream(List list)  return list.isEmpty() 

Sama dengan contoh sebelumnya menggunakan aliran, yang satu ini mempunyai kerumitan waktu O (n) , yang merupakan masa untuk melintasi keseluruhan aliran.

7. Perpustakaan Pihak Ketiga

Sekiranya kita terjebak pada versi Java sebelumnya dan tidak dapat menggunakan Stream API, kita dapat menggunakan perpustakaan pihak ketiga seperti Google Guava dan Apache Commons .

Di sini, kami mempunyai dua penyelesaian yang hampir sama, berulang melalui senarai elemen dan memadankannya dengan elemen pertama. Oleh itu, kita dapat dengan mudah mengira kerumitan masa menjadi O (n) .

7.1. Ketergantungan Maven

Untuk menggunakan kedua-duanya, kita boleh menambah jambu atau koleksi umum4 masing - masing ke projek kita:

 com.google.guava guava 23.0 
     org.apache.commons     commons-collections4     4.1 

7.2. Jambu Batu Google

Di Google Jambu , kaedah statik Iterables.all () kembali benar jika semua elemen dalam senarai memenuhi predikat:

public boolean verifyAllEqualUsingGuava(List list) { return Iterables.all(list, new Predicate() { public boolean apply(String s) { return s.equals(list.get(0)); } }); }

7.3. Apache Commons

Similarly, the Apache Commons library also provides a utility class IterableUtils with a set of static utility methods to operate on Iterable instances.

In particular, the static method IterableUtils.matchesAll() returns true if all elements in the list satisfy the predicate:

public boolean verifyAllEqualUsingApacheCommon(List list) { return IterableUtils.matchesAll(list, new org.apache.commons.collections4.Predicate() { public boolean evaluate(String s) { return s.equals(list.get(0)); } }); } 

8. Conclusion

In this article, we’ve learned different ways of verifying whether all elements in a List are equal starting with simple Java functionality and then showing alternative ways using the Stream API and the third-party libraries Google Guava and Apache Commons.

Kami juga telah mengetahui bahawa setiap penyelesaian memberi kita kerumitan masa yang sama O (n) . Namun, terpulang kepada kita untuk memilih yang terbaik mengikut bagaimana dan di mana ia akan digunakan.

Dan pastikan untuk melihat set sampel lengkap di GitHub.