gpt4 book ai didi

java - 可互换的键/值 HashMap Set 结构

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:23:57 27 4
gpt4 key购买 nike

背景

使用两个操作数创建一系列 SQL JOIN 语句:主要操作数和次要操作数。 JOIN 语句的一般形式是:

JOIN primary primary ON (secondary.id == primary.id)

问题

代码当前遍历主要和次要操作数的列表,如下所示:

for( Bundle primaryOperand : bundleComparators ) {
for( Bundle secondaryOperand : sortedBundles ) {

问题在于嵌套循环生成以下内容:

JOIN primary primary ON (secondary.id == primary.id)
JOIN secondary secondary ON (primary.id == secondary.id)

第二个连接是多余的,在这种情况下会导致错误。可以使用以下假设的数据结构消除重复:

if( !interchangeableMap.contains( primaryOperand, secondaryOperand ) ) {
interchangeableMap.put( primaryOperand, secondaryOperand );

outputJoin( primaryOperand, secondaryOperand );
}

如果 primaryOperand 映射到 secondaryOperandinterchangeableMap.contains(...) 将返回 true < em>或 secondaryOperand 映射到primaryOperand

问题

  1. Java 库中是否存在这样的数据结构?
  2. 如果不是,您会使用什么数据结构来实现它?

想法

我的第一个想法是创建一个包含两个 HashMap 的类。检查包含查询两个 HashMap 以查看一个映射是否包含主要和次要操作数,或者另一个映射是否包含次要和主要操作数。插入将两个操作数组合放入它们各自的 HashMap 中。

谢谢!

最佳答案

这是基于@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();
}
}

然后:

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);
}
}

解决方案的一个微妙之处:您还必须覆盖 hashCode()方法(哈希值必须反射(reflect)相等关系),但必须以对称的方式进行,即:<a,b>的哈希值必须 == 到 <b,a> 的那个

关于java - 可互换的键/值 HashMap Set 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5828647/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com