Java的多对多关联映射 [英] Java many to many association map
问题描述
我要班, ClassA的的和的 ClassB的的和一个多对多的 AssociationClass 的。我想用一个结构来保存A和B之间的关联,例如我可以知道,A或B,这是他们同行的每个实例。
I have to classes, ClassA and ClassB and a "many to many" AssociationClass. I want to use a structure to hold the associations between A and B such as I can know, for each instance of A or B, which are their counterparts.
我想用一个HashMap,用一双键:
I thought of using a Hashmap, with pair keys:
Hasmap<Pair<ClassA, ClassB>, AssociationClass> associations;
这样的话,我可以添加和删除的的 ClassA的的两个实例之间的关联的 ClassB的的,我可以查询两个给定的情况下的关系。
This way, I can add and remove an association between two instances of ClassA and ClassB, and I can query a relation for two given instances.
不过,我想获得为的 ClassA的或 ClassB的的给定实例中定义的所有协会的功能。
However, I miss the feature of getting all associations defined for a given instance of ClassA or ClassB.
我能做到这一点靠强力和环比地图的所有键搜索一个给定的实例之间的关联,但这是效率低下,不优雅。
I could do it by brute force and loop over all keys of the map to search for associations between a given instance, but this is inefficient and not elegant.
你知道的任何数据结构/免费的图书馆,使这个的?我不想重新发明轮子。
Do you know of any data structure / free library that enables this ? I don't want to reinvent the wheel.
在此先感谢您的帮助,
拉斐尔
NB :这不是一个数据库的问题。这些对象用于实时计算的纯POJO,我也不需要持久性的东西。
NB: This is not a "database" question. These objects are pure POJO used for live computation, I don't need persistence stuff.
推荐答案
感谢您的建议。
我终于重新发明轮子...
我写了一个通用类来关联。
我使用的地图两张地图,同步的。
I finally reinvented the wheel ... I have written a generic class for holding associations. I use two maps of maps, synchronized.
的关联保持器提供了以下方法
The associations holder provides the following methods
void setAssociation(LeftClass left, RightClass right, AssociationClass assoc);
AssociationClass getAssociation(LeftClass left, RightClass right);
Map<RightClass, AssociationClass> getAssocationsLeft(LeftClass left);
Map<LeftClass, AssociationClass> getAssocationsRight(RightClass right);
void removeAssociation(LeftClass left, RightClass right);
下面是code:
import java.util.HashMap;
/** This class holds many to many associations between two classes. */
public class AssociationHolder<LeftClass, RightClass, AssociationClass> {
// -------------------------------------------------------
// Attributes
// -------------------------------------------------------
private HashMap<LeftClass, HashMap<RightClass, AssociationClass>> associationsLeft =
new HashMap<LeftClass, HashMap<RightClass,AssociationClass>>();
private HashMap<RightClass, HashMap<LeftClass, AssociationClass>> associationsRight =
new HashMap<RightClass, HashMap<LeftClass,AssociationClass>>();
// -------------------------------------------------------
// Methods
// -------------------------------------------------------
/**
* Set an association between two instance.
* Any prior association is overwritten.
*/
public void setAssociation(LeftClass left, RightClass right, AssociationClass association) {
// Get the map for the left
HashMap<RightClass, AssociationClass> leftMap = this.associationsLeft.get(left);
// No association defined yet for this left key ? => Create new map
if (leftMap == null) {
leftMap = new HashMap<RightClass, AssociationClass>();
this.associationsLeft.put(left, leftMap);
}
// Get the map for the right
HashMap<LeftClass, AssociationClass> rightMap = this.associationsRight.get(right);
// No association defined yet for this right key ? => Create new map
if (rightMap == null) {
rightMap = new HashMap<LeftClass, AssociationClass>();
this.associationsRight.put(right, rightMap);
}
// Set the assoication on both maps
leftMap.put(right, association);
rightMap.put(left, association);
}
/** @return null if no association found. */
public AssociationClass getAssociation(LeftClass left, RightClass right) {
// Use left maps (could have used the right one as well)
HashMap<RightClass, AssociationClass> leftMap = this.associationsLeft.get(left);
if (leftMap == null) return null;
return leftMap.get(right);
}
/** Get all associations defined for a given Left instance. */
public HashMap<RightClass, AssociationClass> getAssociationsLeft(LeftClass left) {
HashMap<RightClass, AssociationClass> leftMap = this.associationsLeft.get(left);
// No map defined ? return empty one instead of null
if (leftMap == null) {
return new HashMap<RightClass, AssociationClass>();
} else {
return leftMap;
}
}
/** Get all associations defined for a given Right instance. */
public HashMap<LeftClass, AssociationClass> getAssociationsRight(RightClass right) {
HashMap<LeftClass, AssociationClass> rightMap = this.associationsRight.get(right);
// No map defined ? return empty one instead of null
if (rightMap == null) {
return new HashMap<LeftClass, AssociationClass>();
} else {
return rightMap;
}
}
/**
* Remove an association between two instances.
*/
public void removeAssociation(LeftClass left, RightClass right) {
HashMap<RightClass, AssociationClass> leftMap = this.getAssociationsLeft(left);
HashMap<LeftClass, AssociationClass> rightMap = this.getAssociationsRight(right);
leftMap.remove(right);
rightMap.remove(left);
}
}
我希望这可以帮助别人的未来。
I hope this can help someone in the future.
这篇关于Java的多对多关联映射的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!