其中已经包含了详细注释
实现的三个接口
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
public class GenericUnionFind<V> {
private Map<V, Node<V>> nodes = new HashMap<>(); //存储V类型的key 和Node<V>类型的value
/* 将传入的v初始化为一个集合
//将传入的V类型的值作为key存在hashMap中,value是: new Node<>(v)
*/
public void makeSet(V v) {
if (nodes.containsKey(v)) return; //如果已经存在v这个key,就不存了。
nodes.put(v, new Node<>(v));
}
/**
* 找出v的根节点
*/
private Node<V> findNode(V v) {
Node<V> node = nodes.get(v);
if (node == null) return null; // v1和v2可能是瞎传的 防止下面一行出现空指针异常
while (!Objects.equals(node.value, node.parent.value)) { //对象的比较方法Objects.equals(o1,o2);
node.parent = node.parent.parent;
node = node.parent;
}
return node;
}
//返回v的根节点的value
public V find(V v) {
Node<V> node = findNode(v);
return node == null ? null : node.value;
}
public void union(V v1, V v2) { //使v1和v2成为1个集合 参照QU_R
Node<V> p1 = findNode(v1);
Node<V> p2 = findNode(v2);
if (p1 == null || p2 == null) return; // v1和v2可能是瞎传的 防止下面一行出现空指针异常
if (Objects.equals(p1.value, p2.value)) return;
if (p1.rank < p2.rank) {
p1.parent = p2;
} else if (p1.rank > p2.rank) {
p2.parent = p1;
} else {
p1.parent = p2;
p2.rank += 1;
}
}
public boolean isSame(V v1, V v2) {
return Objects.equals(find(v1), find(v2));
}
private static class Node<V> {
V value;
Node<V> parent = this;
int rank = 1;
Node(V value) {
this.value = value;
}
}
}