[英]How to implement n:m relation in Java?
我需要在Java中實現n:m關系。 用例是目錄。
我目前的解決方案是擁有一個具有兩個哈希映射的映射類。
這完全是多余的,我需要一個設置類,始終注意在兩個哈希映射中存儲/刪除數據。
但這是我發現在O(1)中創造以下表現的唯一方法:
我想在各方面避免全陣列掃描或類似的事情。
但是必須有另一個更優雅的解決方案,我不需要將數據索引兩次。
請點亮我。 我只有普通的Java,沒有數據庫或SQLite或者可用的東西。 如果可能的話,我也不想真正實現btree結構。
如果您通過成員集合將類別與產品相關聯,反之亦然,那么您可以完成同樣的事情:
public class Product {
private Set<Category> categories = new HashSet<Category>();
//implement hashCode and equals, potentially by id for extra performance
}
public class Category {
private Set<Product> contents = new HashSet<Product>();
//implement hashCode and equals, potentially by id for extra performance
}
唯一困難的部分是填充這樣的結構,可能需要一些中間地圖。
但是使用輔助hashmaps / trees進行索引的方法並不錯。 畢竟,放在數據庫上的大多數索引都是輔助數據結構:它們與行表共存; 行不一定按索引本身的結構組織。
使用這樣的外部結構可以使您保持優化和數據彼此分離; 這不是一件壞事。 特別是如果明天你想為給定供應商的產品添加O(1)查找,例如
編輯:順便說一句,它看起來像你想要的是一個優化的
Multimap的實現,以在O(1)中進行反向查找。
我不認為Guava有什么可做的,但你可以實現Multimap接口,所以至少你不必單獨處理維護HashMaps。
實際上它更像是一個BiMap,它也是一個Multimap,鑒於它們的定義是矛盾的。 我同意MStodd的說法,你可能想要將自己的抽象層用於封裝兩個地圖。
你的解決方案非常好。 請記住,將對象放入HashMap不會復制Object,它只是存儲對它的引用,因此時間和內存的成本非常小。
我會選擇你的第一個解決方案。 在兩個哈希映射周圍有一層抽象。 如果您擔心並發,請為CRUD實施適當的鎖定。
如果您能夠使用不可變數據結構,Guava的ImmutableMultimap
提供了一個inverse()
方法,使您可以按值獲取密鑰集合。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.