说我有对象A,B,C,D。它们可以包含彼此的引用,例如,A可能引用B和C,C可能引用A.我想创建段但不想创建它们两次,所以我不想要段AC和段CA,只是其中一个。所以我想保留一个已创建段的列表,例如:A C,并检查我是否已经有A C或C A,如果是的话就跳过它。
是否有可以执行此操作的数据结构?
由于
if(list.contains(a,b)
{
//dont add
}
答案 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)