Dav*_*vis 7 java algorithm data-structures
使用两个操作数创建一系列SQL JOIN语句:primary和secondary.JOIN语句的通用形式是:
JOIN primary primary ON (secondary.id == primary.id)
Run Code Online (Sandbox Code Playgroud)
代码当前迭代主要和辅助操作数列表,如下所示:
for( Bundle primaryOperand : bundleComparators ) {
for( Bundle secondaryOperand : sortedBundles ) {
Run Code Online (Sandbox Code Playgroud)
问题是嵌套循环生成以下内容:
JOIN primary primary ON (secondary.id == primary.id)
JOIN secondary secondary ON (primary.id == secondary.id)
Run Code Online (Sandbox Code Playgroud)
第二个连接是多余的,在这种情况下,会导致错误.可以使用以下假设数据结构消除重复:
if( !interchangeableMap.contains( primaryOperand, secondaryOperand ) ) {
interchangeableMap.put( primaryOperand, secondaryOperand );
outputJoin( primaryOperand, secondaryOperand );
}
Run Code Online (Sandbox Code Playgroud)
如果映射到或映射到哪里interchangeableMap.contains(...)
将返回true.primaryOperand
secondaryOperand
secondaryOperand
primaryOperand
我的第一个想法是创建一个包含两个HashMap
s 的类.检查包含查询两个HashMap
s以查看一个映射是否包含主操作数和辅助操作数,或者另一个映射包含辅助操作数和主操作数.插入将两个操作数组合放入它们各自的HashMap
s中.
谢谢!
这是基于@ roland建议的解决方案:
public final class Pair {
private final Object a;
private final Object b;
public Pair(Object a, Object b) {
this.a = a;
this.b = b;
}
@Override public boolean equals(Object o) {
if(o == null || !(o instanceof Pair))
return false;
Pair that = (Pair) o;
return this.a.equals(that.a) && this.b.equals(that.b)
|| this.a.equals(that.b) && this.b.equals(that.a);
}
@Override public int hashCode() {
return a.hashCode() ^ b.hashCode();
}
}
Run Code Online (Sandbox Code Playgroud)
然后:
Set<Pair> set = new HashSet<Pair>();
for(Bundle primaryOperand : bundleComparators) {
for(Bundle secondaryOperand : sortedBundles) {
Pair p = new Pair(primaryOperand.id, secondaryOperand.id);
if(set.contains(p))
continue;
set.add(p);
outputJoin(primaryOperand, secondaryOperand);
}
}
Run Code Online (Sandbox Code Playgroud)
关于解决方案的一个微妙之处:您还必须覆盖该hashCode()
方法(哈希值必须反映相等关系),但您必须以对称方式执行此操作,即:哈希值<a,b>
必须==对于<b,a>