我有两个带有数据的类型对象列表,第一个是主体实体,第二个是依赖实体。 另外,我有主表和依赖实体对象之间的关键表。 在第一个for语句中,我得到一个类型为object的实例,然后我继续循环第二个实体的每个实例并尝试查找 它们之间的匹配(我认为是指数问题......),如果匹配则查找使用引用对象更新主体实体。
以下代码正在运行但我从性能角度检查它并且它无法有效地工作。
您是否有想法/提示如何从perforce方面改进此代码。
在JVM监视器中,我发现EntityDataCreator.getInstanceValue
有问题。
这是方法开始
// start with the principal entity
for (Object principalEntityInstance : principalEntityInstances) {
List<Object> genObject = null;
Object refObject = createRefObj(dependentMultiplicity);
// check entries in dependent entity
for (Object dependentEntityInstance : toEntityInstances) {
boolean matches = true;
for (String[] prop : propertiesMappings) {
// Get properties related keys
String fromProp = prop[0];
String toProp = prop[1];
Object fromValue = EntityDataCreator.getInstanceValue(fromProp, principalEntityInstance);
Object toValue = EntityDataCreator.getInstanceValue(toProp, dependentEntityInstance);
if (fromValue != null && toValue != null) {
if (!fromValue.equals(toValue)) {
matches = false;
break;
}
}
}
if (matches) {
// all properties match
if (refObject instanceof List) {
genObject = (List<Object>) refObject;
genObject.add(dependentEntityInstance);
refObject = genObject;
} else {
refObject = dependentEntityInstance;
break;
}
}
}
if (refObject != null) {
EntityDataCreator.createMemberValue(principalEntityInstance, navigationPropName, refObject);
}
}
public static Object getInstanceValue(String Property, Object EntityInstance) throws NoSuchFieldException,
IllegalAccessException {
Class<? extends Object> EntityObj = EntityInstance.getClass();
Field Field = EntityObj.getDeclaredField(Property);
Field.setAccessible(true);
Object Value = Field.get(EntityInstance);
Field.setAccessible(false);
return Value;
}
答案 0 :(得分:3)
我的猜测是你最好的选择是一次浏览两个列表,准备哈希表中需要的所有数据,然后进行一次迭代。这样,你的问题变成N + M而不是N * M
修改
Map<String,List<Object>> principalMap = new HashMap<String,List<Object>>();
for (Object principalEntityInstance : principalEntityInstances) {
List<String> keys = getKeysFor(principalEntityInstance);
for(String key : keys) {
List<Object> l = principalMap.get(key);
if(l==null) {
l = new ArrayList<Object>();
principalMap.put(key,l);
}
l.add(principalEntityInstance);
}
}
对dependentEntityInstance执行相同的操作 - 这样,您的搜索速度会快得多。
答案 1 :(得分:1)
我可能误解了你的问题,但我建议为你的实体定义一个equals方法,并为它们定义一个散列方法,这样你就可以利用java已经拥有的所有优点来搜索和匹配实体。
在我认为可能完全依赖Java的基础架构时,Sun / Oracle花了很长时间才真正做到这一点。