我需要创建一个加权有向图。我已经看到的实现将顶点表示为简单整数,并且边缘用邻接列表表示。但是我需要由自定义类的对象表示的顶点。有了这个图,我需要执行典型的操作(特别是Dijkstra)。
我的想法是以某种方式将对象表示为整数,但我不知道如何提出可以双向转换的散列函数(即顶点到int和int到顶点)。
答案 0 :(得分:0)
如果您真的想在图表中将顶点表示为(唯一)整数,可以使用ArrayList
从顶点映射到对象,并使用HashMap<MyObject, Integer>
进行映射。您可以将此对包装在您自己的类中,提供getIndex()
和getElement()
(如下面所示),这可能会提高可读性。
那就是说,为什么不使用http://jgrapht.org或类似的库?
public class IndexMap<T> {
private List<T> elements = new ArrayList<>();
private Map<T, Integer> indices = new HashMap<>();
public int add(T element) {
int index = elements.size();
elements.add(element);
indices.put(element, index);
return index;
}
public int getIndex(T element) {
Integer index = indices.get(element);
return index == null ? -1 : index;
}
public T getElement(int index) {
return elements.get(index);
}
如果您不需要(重新)使用预先存在的基于整数的图并且不能使用库,您可以选择实现自己的Vertex类而不是存储对象:
class Vertex<T> {
T element;
List<Vertex<T>> edges = new ArrayList<>();
Vertex(T element) {
this.element = element;
}
void addEdge(Vertex<t> to) {
edges.add(to);
}
...
}