Saya punya ArrayList
, kelas Koleksi Java, sebagai berikut:
ArrayList<String> animals = new ArrayList<String>();
animals.add("bat");
animals.add("owl");
animals.add("bat");
animals.add("bat");
Seperti yang Anda lihat, animals
ArrayList
terdiri dari 3 bat
elemen dan satu owl
elemen. Saya bertanya-tanya apakah ada API dalam kerangka Koleksi yang mengembalikan jumlah bat
kemunculan atau jika ada cara lain untuk menentukan jumlah kemunculan.
Saya menemukan bahwa Koleksi Google Multiset
memang memiliki API yang mengembalikan jumlah kemunculan elemen. Tapi itu hanya kompatibel dengan JDK 1.5. Produk kami saat ini di JDK 1.6, jadi saya tidak bisa menggunakannya.
Jawaban:
Saya cukup yakin metode frekuensi statis dalam Koleksi akan berguna di sini:
Begitulah cara saya melakukannya. Saya cukup yakin ini jdk 1.6 lurus ke atas.
sumber
Di Jawa 8:
sumber
Collections.frequency()
? Sepertinya kurang mudah dibaca.Ini menunjukkan, mengapa penting untuk " Merujuk ke objek dengan antarmuka mereka " seperti yang dijelaskan dalam buku Java yang Efektif .
Jika Anda membuat kode untuk implementasi dan menggunakan ArrayList di katakanlah, 50 tempat dalam kode Anda, ketika Anda menemukan implementasi "Daftar" yang baik yang menghitung item, Anda harus mengubah semua 50 tempat itu, dan mungkin Anda harus pecahkan kode Anda (jika hanya digunakan oleh Anda tidak ada masalah besar, tetapi jika digunakan oleh orang lain menggunakan, Anda juga akan memecahkan kode mereka)
Dengan memprogram ke antarmuka, Anda dapat membiarkan 50 tempat itu tidak berubah dan mengganti implementasi dari ArrayList ke "CountItemsList" (misalnya) atau kelas lain.
Di bawah ini adalah contoh yang sangat mendasar tentang bagaimana ini bisa ditulis. Ini hanya sampel, Daftar siap produksi akan jauh lebih rumit.
Prinsip-prinsip OO yang diterapkan di sini: pewarisan, polimorfisme, abstraksi, enkapsulasi.
sumber
Maaf tidak ada pemanggilan metode sederhana yang dapat melakukannya. Yang perlu Anda lakukan hanyalah membuat peta dan menghitung frekuensi dengannya.
sumber
Tidak ada metode asli di Jawa untuk melakukannya untuk Anda. Namun, Anda dapat menggunakan IterableUtils # countMatches () dari Apache Commons-Collections untuk melakukannya untuk Anda.
sumber
Sebenarnya, kelas Koleksi memiliki metode statis yang disebut: frekuensi (Koleksi c, Objek o) yang mengembalikan jumlah kemunculan elemen yang Anda cari, omong-omong, ini akan bekerja dengan sempurna untuk Anda:
sumber
Alternatif Java 8 solusi menggunakan Streaming :
sumber
Saya ingin tahu, mengapa Anda tidak dapat menggunakan Google Collection API itu dengan JDK 1.6. Apakah dikatakan demikian? Saya pikir Anda bisa, seharusnya tidak ada masalah kompatibilitas, karena dibuat untuk versi yang lebih rendah. Kasing akan berbeda jika yang dibangun untuk 1,6 dan Anda menjalankan 1,5.
Apakah saya salah di suatu tempat?
sumber
Pendekatan yang sedikit lebih efisien mungkin
sumber
Untuk mendapatkan kemunculan objek dari daftar secara langsung:
Untuk mendapatkan kemunculan koleksi Objek di dalam daftar, ganti metode equals di kelas Object sebagai:
Panggil Collections.frequency sebagai:
sumber
Cara sederhana untuk menemukan terjadinya nilai string dalam array menggunakan fitur Java 8.
Output: {Cat = 2, Kambing = 1, Sapi = 1, sapi = 1, Anjing = 1}
Anda dapat melihat "Sapi" dan sapi tidak dianggap sebagai string yang sama, jika Anda memerlukannya dalam jumlah yang sama, gunakan .toLowerCase (). Temukan cuplikan di bawah untuk hal yang sama.
Output: {cat = 2, sapi = 2, kambing = 1, anjing = 1}
sumber
toString()
tidak perlu. Anda bisa melakukan:duplicateList.stream().collect(Collectors.groupingBy(e -> e,Collectors.counting()));
Yang Anda inginkan adalah Tas - yang seperti satu set tetapi juga menghitung jumlah kejadian. Sayangnya kerangka java Collections - hebat karena mereka tidak memiliki Bag impl. Untuk itu orang harus menggunakan teks tautan Apache Common Collection
sumber
Metode 1:
Metode 2:
sumber
Jika Anda menggunakan Eclipse Collections , Anda dapat menggunakan a
Bag
. AMutableBag
dapat dikembalikan dari implementasi apa punRichIterable
dengan menelepontoBag()
.The
HashBag
implementasi dalam Eclipse Koleksi didukung olehMutableObjectIntMap
.Catatan: Saya pengendara untuk Eclipse Collections.
sumber
Masukkan elemen-elemen dari daftar array di hashMap untuk menghitung frekuensi.
sumber
Java 8 - metode lain
sumber
Jadi lakukan dengan cara lama dan gulir sendiri:
sumber
Jika Anda adalah pengguna DSL ForEach saya , itu bisa dilakukan dengan
Count
kueri.sumber
Saya tidak ingin membuat kasus ini lebih sulit dan membuatnya dengan dua iterator Saya memiliki HashMap dengan LastName -> FirstName. Dan metode saya harus menghapus item dengan menculik FirstName.
sumber
Keluaran:
sumber
sumber
sumber