Struktur data apa yang dapat saya gunakan untuk mengurutkan/membandingkan objek berdasarkan beberapa kriteria?

Kami memiliki kumpulan objek, setiap objek memiliki ID integer dan stempel waktu. Kami ingin dapat mencari duplikat dan memperbarui koleksi berdasarkan ID.

Namun kami juga ingin dapat mengambil "sepotong" dari koleksi tersebut, misalnya menemukan setiap objek dengan stempel waktu setelah waktu tertentu. Jadi kami juga ingin mengurutkan berdasarkan stempel waktu.

Kami menggunakan TreeMap, yang pada awalnya tampak memberikan apa yang kami inginkan. Namun karena TreeMap (dan semua yang berasal dari SortedSet) hanya menggunakan bandingkanTo() dan mengabaikan metode sama dengan(), kami menemukan bahwa pencarian duplikat berdasarkan ID tidak berhasil. Metode bandingkanTo() kami mencoba mengizinkan kedua kondisi (mencari berdasarkan ID ATAU stempel waktu) tetapi pada akhirnya berukuran besar dan jelek serta tidak benar-benar berfungsi. :)

Koleksi ini bisa saja bertambah sangat banyak, jadi tentunya kita ingin mencari/menyortir/memasukkan secepat mungkin.


person Phillip Atkinson    schedule 07.09.2011    source sumber
comment
Apakah duplikat merupakan Objek yang memiliki id DAN stempel waktu yang sama dengan objek lain?   -  person Liviu T.    schedule 07.09.2011
comment
Maaf, seharusnya ditentukan - suatu Objek adalah duplikat jika memiliki ID yang sama.   -  person Phillip Atkinson    schedule 07.09.2011


Jawaban (1)


Anda dapat menggunakan dua TreeMaps, satu yang memetakan ID ke objek, dan satu lagi yang memetakan stempel waktu ke objek.

Kemudian Anda dapat dengan mudah menemukan objek berdasarkan idnya, atau stempel waktunya. Anda juga bisa mendapatkan sekumpulan objek yang memiliki stempel waktu dalam rentang tertentu (seperti yang sudah Anda ketahui).

Kekurangannya jelas Anda harus menghapus objek dari kedua koleksi. Namun hal ini seharusnya tidak terlalu buruk, karena setiap objek mengetahui id dan stempel waktunya, jadi jika Anda ingin menghapus berdasarkan stempel waktu, Anda mendapatkan id secara gratis, dan Anda hanya terpaksa melakukan satu operasi log lagi.

Bungkus semuanya dalam koleksi Anda sendiri jika Anda mau.

person aioobe    schedule 07.09.2011
comment
Terima kasih untuk sarannya! Kami mencoba menggunakan ide ini sekarang, tapi kami mengalami masalah saat menyiapkan TreeMap yang menggunakan stempel waktu sebagai Kuncinya, karena stempel waktu tidak dijamin unik. Mencoba menggunakan TreeMap seperti TreeMap‹Date, List‹Object››, namun hal tersebut menjadi sangat jelek dengan sangat cepat, dan kami masih berjuang untuk membuatnya berfungsi. - person Phillip Atkinson; 07.09.2011
comment
Ah iya. Itu mungkin menjadi sebuah kekhawatiran. Jika saya jadi Anda, saya akan mulai melihat Guava atau Apache commons sekarang jika saya jadi Anda. Harus ada beberapa TreeMultiMap yang sesuai dengan kebutuhan Anda. - person aioobe; 07.09.2011
comment
Terima kasih - kami akan melakukan ini, menggunakan Apache TreeMultiMap. Kami mencoba menghindari terlalu banyak perpustakaan pihak ketiga, namun dalam kasus ini tampaknya lebih baik daripada menciptakan kembali roda. - person Phillip Atkinson; 13.09.2011
comment
@Phillip, menjauhi kekacauan ketergantungan pihak ketiga adalah cara yang baik, namun Apache Commons atau Guava cukup standar, dan pada gilirannya tidak memerlukan apa pun yang saya ketahui, jadi menurut saya Anda melakukan hal yang benar di sini . - person aioobe; 13.09.2011