【发布时间】:2022-01-10 04:15:52
【问题描述】:
可以这样投吗?
Iterator<Class that implemets the interface> --> Iterator<Interface>
我的算法课中有这个成员
public HashMap<Integer, HashMap<NodeC, EdgeC>> edges;
在这个函数上,我正在生成一个迭代器类型 <EdgeData> 需要返回,但问题是我正在使用 Edge Class 的类,所以它会抛出错误
@Override
public Iterator<EdgeData> edgeIter(int node_id) {
return this.edges.get(node_id).values().iterator();
}
Incompatible types. Found: 'java.util.Iterator<src.api.Edge>', required: 'java.util.Iterator<src.interfaces.EdgeData>'```
关于图表的程序
结构
interfaces
|--> EdgeData
|--> Algo
Classes
|--> Edge implements EdgeData
|--> AlgoClass implements Algo
在我的 AlgoClass 中,我使用的是 HashMap
所以我通过首先传递边缘的源在 o(1) 中获得边缘,然后每个节点在其内部都有一个哈希图,因此通过传递目标我将获得正确的边缘!大约在 o(1) 中。
问题在于 edgeIter 函数中迭代器的返回类型,我需要它是 EdgeData 类型,如接口 EdgeData。 而且我不知道是否可以将迭代器转换为迭代器。
【问题讨论】:
-
旁注:您应该使用
Map<Integer, Map<Node, Edge>>。代码到接口,而不是实现。 -
更好的是,将其更改为
Map<Integer, Map<Node, EdgeData>>,然后您的迭代器自然会成为Iterator<EdgeData>。 -
这就是我最终做的;问题是一条边包含这个成员,src,dest,weight,我使用 src 作为地图的键,如果我有相同的 src,最终会超出值,所以我切换到
Map<String, Map<Node, EdgeData>>,现在我将密钥保存为"src_" + src + "_dest_" + dest :)