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

前端之家收集整理的这篇文章主要介绍了java – 可互换的键/值HashMap Set结构前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
背景

使用两个操作数创建一系列sql JOIN语句:primary和secondary. JOIN语句的通用形式是:

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

问题

代码当前迭代主要和辅助操作数列表,如下所示:

  1. for( Bundle primaryOperand : bundleComparators ) {
  2. for( Bundle secondaryOperand : sortedBundles ) {

问题是嵌套循环生成以下内容

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

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

  1. if( !interchangeableMap.contains( primaryOperand,secondaryOperand ) ) {
  2. interchangeableMap.put( primaryOperand,secondaryOperand );
  3.  
  4. outputJoin( primaryOperand,secondaryOperand );
  5. }

其中,如果将primaryOperand映射到secondaryOperand或将secondaryOperand映射到primaryOperand,则interchangeableMap.contains(…)将返回true.

问题

> Java库中是否存在这样的数据结构?
>如果没有,您将使用哪些数据结构来实现它?

思路

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

谢谢!

解决方法

这是基于@ roland建议的解决方案:
  1. public final class Pair {
  2. private final Object a;
  3. private final Object b;
  4.  
  5. public Pair(Object a,Object b) {
  6. this.a = a;
  7. this.b = b;
  8. }
  9.  
  10. @Override public boolean equals(Object o) {
  11. if(o == null || !(o instanceof Pair))
  12. return false;
  13.  
  14. Pair that = (Pair) o;
  15. return this.a.equals(that.a) && this.b.equals(that.b)
  16. || this.a.equals(that.b) && this.b.equals(that.a);
  17. }
  18.  
  19. @Override public int hashCode() {
  20. return a.hashCode() ^ b.hashCode();
  21. }
  22. }

然后:

  1. Set<Pair> set = new HashSet<Pair>();
  2. for(Bundle primaryOperand : bundleComparators) {
  3. for(Bundle secondaryOperand : sortedBundles) {
  4. Pair p = new Pair(primaryOperand.id,secondaryOperand.id);
  5. if(set.contains(p))
  6. continue;
  7.  
  8. set.add(p);
  9. outputJoin(primaryOperand,secondaryOperand);
  10. }
  11. }

关于解决方案的一个细微之处:您还必须覆盖hashCode()方法(哈希值必须反映相等关系),但您必须以对称方式执行,即:< a,b>的哈希值.必须==与< b,a>

猜你在找的Java相关文章