[英]Java: Weighted Directed Graph where the vertices are OBJECTS
我需要创建一个加权图。 我见过的实现将顶点表示为简单的整数,并且用邻接表表示边缘。 但是,我需要由自定义类的对象表示的顶点。 使用此图,我需要执行典型的操作(特别是Dijkstra)。
我的想法是以某种方式哈希表示对象为整数,但我不知道如何提出可以同时转换的哈希函数(即,将顶点转换为int并将int转换为int)。
如果您确实想将顶点表示为图形中的(唯一)整数,则可以使用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);
}
...
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.