假设我有对象 A、B、C、D。它们可以包含彼此的引用,例如,A 可能引用 B 和 C,而 C 可能引用 A。我想创建段,但不想创建两次,所以我不需要段 A C 和段 C A,只需其中 1 个。所以我想保留创建的段的列表,例如:A C,并检查我是否已经有 A C 或 CA,如果有则跳过它。
有没有一种数据结构可以做到这一点?
谢谢
if(list.contains(a,b)
{
//dont add
}
最佳答案
你可以介绍类似的东西
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 < PairKey < ?扩展 Comparable>> 然后检查给定的对是否已经存在。
您需要使顶点具有可比性,因此可以将 PairKey(A,B) 视为等于 PairKey(B,A)
然后 HashSet 将为您完成剩下的工作,例如您将能够查询
pairs.contains(new PairKey(A,B));
如果对包含 PairKey(A,B) 或 PairKey(B,A) - 它将返回 true。
hashCode 实现可能略有不同,IDE 可能会生成更复杂的东西。
希望有帮助。
关于java - 检查配对的数据结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12771016/