В стандартном алгоритме каждой вершине присваивается идентификатор int
, который представляет ее место в массиве. Таким образом, это означает, что parent[0]
содержит идентификатор родителя вершины 0 и т. Д.
Действительно, вы можете считать массивы просто очень эффективной картой от int
до чего-то еще. Если вы замените int
более сложным типом, вам нужно начать использовать Map
вместо массива.
Итак, если вы хотите использовать класс с именем Vertex
для представления вершин, вам нужно объявить родителей и ранги по-другому:
Map<Vertex,Vertex> parent = new HashMap<>();
Map<Vertex,Rank> rank = new HashMap<>();
Вы можете заменить Rank
на Byte
, если хотите придерживаться текущей схемы - хотя, вероятно, лучше использовать инкапсуляцию для использования класса.
Затем вы получите код, который выглядит примерно так:
while (!vertex.equals(parent.get(vertex))) {
parent.put(vertex, parent.get(parent.get(vertex)));
vertex = parent.get(vertex);
}
return vertex;
Следует помнить, что если вы собираетесь использовать Vertex
в качестве ключа карты (как я рекомендовал), то вы должны реализовать equals
и hashCode
методы.