【发布时间】:2016-03-19 14:29:11
【问题描述】:
我需要创建一个加权有向图。我见过的实现将顶点表示为简单的整数,而边用邻接表表示。但是,我需要由自定义类的对象表示的顶点。使用此图,我需要执行典型操作(特别是 Dijkstra)。
我的想法是散列以某种方式将对象表示为整数,但我不知道如何提出一个可以双向转换的散列函数(即顶点到 int 和 int 到顶点)。
【问题讨论】:
标签: java data-structures graph
我需要创建一个加权有向图。我见过的实现将顶点表示为简单的整数,而边用邻接表表示。但是,我需要由自定义类的对象表示的顶点。使用此图,我需要执行典型操作(特别是 Dijkstra)。
我的想法是散列以某种方式将对象表示为整数,但我不知道如何提出一个可以双向转换的散列函数(即顶点到 int 和 int 到顶点)。
【问题讨论】:
标签: java data-structures graph
如果您真的想在图中将顶点表示为(唯一)整数,您可以使用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);
}
...
}
【讨论】: