检查对的数据结构?

时间:2012-10-07 17:17:16

标签: java data-structures

说我有对象A,B,C,D。它们可以包含彼此的引用,例如,A可能引用B和C,C可能引用A.我想创建段但不想创建它们两次,所以我不想要段AC和段CA,只是其中一个。所以我想保留一个已创建段的列表,例如:A C,并检查我是否已经有A C或C A,如果是的话就跳过它。

是否有可以执行此操作的数据结构?

由于

if(list.contains(a,b)
{
   //dont add
}

5 个答案:

答案 0 :(得分:2)

你可能会介绍类似

的内容
class PairKey<T extends Comparable<T>> { 
  final T fst, snd;
  public PairKey(T a, T b) {
    if (a.compareTo(b) <=0 ) {
      fst = a;
      snd = b;
    } else {
      fst = b;
      snd = a;
    }
  }

  @Override
  public int hashCode() {
    return a.hashCode() & 37 & b.hashCode();
  }

  @Override
  public boolean equals(Object other) {
    if (other == this) return true;
    if (!(other instanceOf PairKey)) return false;
    PairKey<T> obj = (PairKey<T>) other;
    return (obj.fst.equals(fst) && obj.snd.equals(snd));
  }
}

然后你可以将边缘放入HashSet&lt; PairKey&lt; ? extends Comparable&gt; &GT;然后检查给定的对是否已经存在。

你需要使你的顶点具有可比性,因此可以将PairKey(A,B)视为等于PairKey(B,A)

然后HashSet将为您完成剩下的工作,例如,您将能够查询

pairs.contains(new PairKey(A,B)); 

如果对包含PairKey(A,B)或PairKey(B,A) - 它将返回true。

hashCode实现可能略有不同,可能是IDE会生成更复杂的东西。

希望有所帮助。

答案 1 :(得分:1)

我会使用一个名为Pair的对象,它看起来像这样:

class Pair  
{  
    Node start;  
    Node end;  

    public Pair(Node start, Node end)  
    { 
      this.start=start;
      this.end=end;  
    }  

   public Pair reverse()  
   {  
       return new Pair(end,start);  
   }  
}  

现在你可以这样做:

if(pairs.contains(currentPair) || pairs.contains(currentPair.reverse())  
{  
    continue;
}  else{  
     pairs.add(currentPair);  
}

正如评论中指出的那样,您需要实现equals和hashcode。但是,进行检查等于使其与段的反转相匹配是纯粹的OO中的一种不好的做法。通过在注释中描述的方式实现equals,只会将Pair绑定到您的应用程序并删除它的可移植性。

答案 2 :(得分:0)

您可以使用一组对象。

Set<Set<MyObjectType>> segments = new HashSet<Set<MyObjectType>>();

然后你可以添加代表MyObject对的两元素集。由于集合是无序的,如果segments包含带有A和B的集合,则尝试添加包含B和A的集合会将其视为segments中已存在的集合。

Set<MyObjectType> segment = new HashSet<MyObjectType>();
segment.add(A); // A and B are instances of MyObjectType
segment.add(B);
segments.add(segment);
segment = new HashSet<MyObjectType>();
segment.add(B);
segment.add(A);
segments.add(segment);
System.out.println("Number of segments: " + segments.size()); // prints 1

答案 3 :(得分:0)

使用java.util.Set / java.util.HashSet并继续添加您找到的参考文献,例如

   Set set1 = new HashSet();
   set1.add(A), set1.Add(C), set1.Add(C)

您可以将此结果添加到外部集中,如finalSet.add(set1)

  Set<Set> finalSet = new HashSet<Set>();
  finalSet.add(set1);

这会自动过滤掉重复项,最后只剩下A & C

答案 4 :(得分:0)

你的问题与图论有关。

您可以尝试删除该内部列表并创建一个Incidence Martrix,即所有对象共享。

最终解决方案主要取决于任务目标和可用结构。因此,您提供的描述很难为您选择最佳解决方案。