1. Gambaran keseluruhan
Mencari elemen dalam senarai adalah tugas yang sangat biasa kita hadapi sebagai pembangun.
Dalam tutorial ringkas ini, kita akan membahas pelbagai cara untuk melakukan ini dengan Java.
2. Persediaan
Mula-mula mari kita mulakan dengan menentukan POJO Pelanggan :
public class Customer { private int id; private String name; // getters/setters, custom hashcode/equals }
Kemudian ArrayList pelanggan:
List customers = new ArrayList(); customers.add(new Customer(1, "Jack")); customers.add(new Customer(2, "James")); customers.add(new Customer(3, "Kelly"));
Perhatikan bahawa kami telah mengatasi hashCode dan sama dengan kelas Pelanggan kami .
Berdasarkan pelaksanaan kami yang sama , dua objek Pelanggan dengan id yang sama akan dianggap sama.
Kami akan menggunakan senarai pelanggan ini .
3. Menggunakan Java API
Java sendiri menyediakan beberapa cara untuk mencari item dalam senarai:
- Yang mengandungi kaedah
- The indexOf kaedah
- Ad-hoc untuk gelung
- The Stream API
3.1. mengandungi ()
List mendedahkan kaedah yang disebut mengandungi :
boolean contains(Object element)
Seperti namanya, kaedah ini kembali benar jika senarai itu mengandungi elemen yang ditentukan , dan mengembalikan palsu sebaliknya.
Oleh itu, apabila kita perlu memeriksa apakah item tertentu ada dalam senarai kita, kita dapat:
Customer james = new Customer(2, "James"); if (customers.contains(james)) { // ... }
3.2. Indeks()
indexOf adalah kaedah lain yang berguna untuk mencari elemen:
int indexOf(Object element)
Kaedah ini mengembalikan indeks kejadian pertama elemen yang ditentukan dalam senarai yang diberikan, atau -1 jika senarai tersebut tidak mengandungi elemen tersebut .
Oleh itu, secara logiknya, jika kaedah ini mengembalikan apa-apa selain -1, kita tahu bahawa senarai tersebut mengandungi elemen:
if(customers.indexOf(james) != -1) { // ... }
Kelebihan utama menggunakan kaedah ini ialah ia dapat memberitahu kita kedudukan elemen yang ditentukan dalam senarai yang diberikan.
3.3. Gelung Asas
Sekarang bagaimana jika kita mahu melakukan pencarian elemen di lapangan? Sebagai contoh, katakan kita mengumumkan undian dan kita perlu menyatakan Pelanggan dengan nama tertentu sebagai pemenang.
Untuk carian berasaskan lapangan seperti itu, kita dapat beralih ke lelaran.
Cara tradisional untuk melakukan lelaran melalui senarai adalah menggunakan salah satu konstruk perulangan Java. Dalam setiap lelaran, kami membandingkan item semasa dalam senarai dengan elemen yang kami cari untuk melihat apakah itu sesuai:
public Customer findUsingEnhancedForLoop( String name, List customers) { for (Customer customer : customers) { if (customer.getName().equals(name)) { return customer; } } return null; }
Di sini nama merujuk kepada nama yang kami cari dalam senarai pelanggan yang diberikan . Kaedah ini mengembalikan objek Pelanggan pertama dalam senarai dengan nama yang sepadan , atau batal jika tidak ada Pelanggan tersebut .
3.4. Gelung dengan Iterator
Iterator adalah cara lain untuk melintasi senarai item.
Kita hanya boleh mengambil contoh sebelumnya dan mengubahnya sedikit:
public Customer findUsingIterator( String name, List customers) { Iterator iterator = customers.iterator(); while (iterator.hasNext()) { Customer customer = iterator.next(); if (customer.getName().equals(name)) { return customer; } } return null; }
Akibatnya, kelakuannya sama seperti sebelumnya.
3.5. API Aliran Java 8
Pada Java 8, kita juga dapat menggunakan Stream API untuk mencari elemen dalam Daftar.
Untuk mencari elemen yang sesuai dengan kriteria tertentu dalam senarai tertentu, kami:
- memanggil aliran () dalam senarai
- sebut kaedah f ilter () dengan Predikat yang betul
- panggil konstruk findAny () , yang mengembalikan elemen pertama yang sesuai dengan predikat penapis yang dibungkus dalam Pilihan jika elemen seperti itu wujud
Customer james = customers.stream() .filter(customer -> "James".equals(customer.getName())) .findAny() .orElse(null);
Untuk kemudahan, kami lalai untuk membatalkan sekiranya Pilihan kosong, tetapi ini mungkin tidak selalu menjadi pilihan terbaik untuk setiap senario.
4. Perpustakaan Pihak Ketiga
Now, while the Stream API is more than sufficient, what should we do if we're stuck on an earlier version of Java?
Fortunately, there are many third-party libraries like Google Guava and Apache Commons which we can use.
4.1. Google Guava
Google Guava provides functionality that is similar to what we can do with streams:
Customer james = Iterables.tryFind(customers, new Predicate() { public boolean apply(Customer customer) { return "James".equals(customer.getName()); } }).orNull();
Just like with Stream API, we can optionally choose to return a default value instead of null:
Customer james = Iterables.tryFind(customers, new Predicate() { public boolean apply(Customer customer) { return "James".equals(customer.getName()); } }).or(customers.get(0));
The above code will pick the first element in the list if no match is found.
Also, don't forget that Guava throws a NullPointerException if either the list or the predicate is null.
4.2. Apache Commons
We can find an element in almost the exact same way using Apache Commons:
Customer james = IterableUtils.find(customers, new Predicate() { public boolean evaluate(Customer customer) { return "James".equals(customer.getName()); } });
Terdapat beberapa perbezaan penting:
- Apache Commons hanya mengembalikan nol jika kita lulus senarai nol .
- Iatidak memberikan fungsi nilai lalai seperti Guava's tryFind.
5. Kesimpulan
Dalam artikel ini, kami mempelajari berbagai cara untuk menemukan elemen dalam Daftar, mulai dengan pemeriksaan keberadaan cepat dan menyelesaikan dengan pencarian di lapangan.
Kami juga melihat perpustakaan pihak ketiga Google Guava dan Apache Commons sebagai alternatif untuk Java 8 Streams API.
Terima kasih kerana berhenti, dan ingatlah untuk melihat semua sumber untuk contoh ini di GitHub.