ฉันสามารถใช้โครงสร้างข้อมูลใดในการเรียงลำดับ/เปรียบเทียบออบเจ็กต์ตามเกณฑ์หลายเกณฑ์ได้

เรามีคอลเลกชันของวัตถุ แต่ละวัตถุมีรหัสจำนวนเต็มและการประทับเวลา เราต้องการที่จะค้นหารายการที่ซ้ำกันและอัปเดตคอลเลกชันตาม ID

แต่เรายังต้องการที่จะสามารถ "แบ่งส่วน" ของคอลเลกชันได้ เช่น การค้นหาวัตถุทุกชิ้นที่มีการประทับเวลาหลังจากเวลาที่กำหนด ดังนั้นเราจึงต้องการเรียงลำดับการประทับเวลาด้วย

เรากำลังใช้ TreeMap ซึ่งในตอนแรกดูเหมือนจะให้สิ่งที่เราต้องการแก่เรา แต่เนื่องจาก TreeMap (และทุกอย่างที่ได้มาจาก SortedSet) ใช้เพียง comparisonTo() และละเว้นเมธอดเท่ากับ () เราจึงพบว่าการค้นหารายการที่ซ้ำกันตาม ID ไม่ได้ผล เมธอด CompareTo() ของเราพยายามอนุญาตทั้งสองเงื่อนไข (ค้นหาด้วย ID หรือการประทับเวลา) แต่สุดท้ายแล้วมันก็มีขนาดใหญ่และน่าเกลียดและไม่สามารถใช้งานได้จริง :)

คอลเลกชันนี้อาจขยายใหญ่ขึ้นได้ ดังนั้นแน่นอนว่าเราต้องการการค้นหา / การเรียงลำดับ / การแทรกอย่างรวดเร็วที่สุด


person Phillip Atkinson    schedule 07.09.2011    source แหล่งที่มา
comment
วัตถุที่ซ้ำกันซึ่งมีรหัสและการประทับเวลาเดียวกันกับวัตถุอื่นหรือไม่   -  person Liviu T.    schedule 07.09.2011
comment
ขออภัย ควรระบุ - ออบเจ็กต์ซ้ำกันหากมี ID เดียวกัน   -  person Phillip Atkinson    schedule 07.09.2011


คำตอบ (1)


คุณสามารถใช้ TreeMaps สองอัน อันหนึ่งจับคู่ ID กับอ็อบเจ็กต์ และอีกอันหนึ่งจับคู่การประทับเวลากับอ็อบเจ็กต์

จากนั้นคุณสามารถค้นหาออบเจ็กต์ตามรหัสหรือเวลาประทับได้อย่างง่ายดาย คุณยังสามารถรับชุดของออบเจ็กต์ที่มีการประทับเวลาในช่วงเฉพาะ (ดังที่คุณทราบแล้ว)

ข้อเสียเปรียบก็คือคุณต้องลบวัตถุออกจากคอลเลกชันทั้งสอง อย่างไรก็ตาม สิ่งนี้ไม่ควรแย่ขนาดนั้น เนื่องจากแต่ละออบเจ็กต์รู้ทั้งรหัสและการประทับเวลา ดังนั้น หากคุณต้องการลบด้วยการประทับเวลา คุณจะได้รับรหัสฟรี และคุณเพียงแค่ถูกบังคับให้ทำบันทึกอีกครั้งหนึ่ง

รวบรวมไว้ในคอลเลกชันของคุณเองหากคุณต้องการ

person aioobe    schedule 07.09.2011
comment
ขอบคุณสำหรับข้อเสนอแนะ! เรากำลังพยายามใช้แนวคิดนี้ในขณะนี้ แต่เรากำลังประสบปัญหาในการตั้งค่า TreeMap ที่ใช้การประทับเวลาเป็นคีย์ เนื่องจากการประทับเวลาไม่รับประกันว่าจะไม่ซ้ำกัน พยายามใช้ TreeMap เช่น TreeMap‹Date, List‹Object›› แต่นั่นเริ่มน่าเกลียดอย่างรวดเร็ว และเรายังคงต่อสู้กับมันเพื่อให้มันใช้งานได้ - person Phillip Atkinson; 07.09.2011
comment
อ๋อ.. นั่นอาจเป็นข้อกังวล ถ้าฉันเป็นคุณ ฉันคงจะเริ่มดู Guava หรือ Apache commons ตอนนี้ถ้าฉันเป็นคุณ ควรมี TreeMultiMap บางส่วนที่เหมาะกับความต้องการของคุณ - person aioobe; 07.09.2011
comment
ขอบคุณ เราจะดำเนินการนี้โดยใช้ Apache TreeMultiMap เราพยายามที่จะอยู่ห่างจากไลบรารีของบุคคลที่สามมากเกินไป แต่ในกรณีนี้ มันดูดีกว่าการคิดค้นวงล้อขึ้นมาใหม่ - person Phillip Atkinson; 13.09.2011
comment
@ ฟิลลิป การอยู่ห่างจากการพึ่งพาของบุคคลที่สามเป็นวิธีที่ดี imo, Apache Commons หรือ Guava นั้นค่อนข้างมาตรฐานและไม่ต้องการสิ่งใดที่ฉันรู้ดังนั้นฉันคิดว่าคุณกำลังทำสิ่งที่ถูกต้องที่นี่ . - person aioobe; 13.09.2011