我正在使用 Java Jung 2.01 图包进行图论中的一些分析。我的算法采用 Forest<V, E>
这样我就可以转换到 DelegateForest<V,E>
所以我可以使用 getTrees()
获取森林组件实例的方法。我的算法是递归的,将在 getTrees()
中的每个组件上执行方法。
所以,问题是 getTrees()
的返回类型这是 Tree<V, E>
的集合由于我的算法采用 Forest<V, E>
(并且在某些时候强制转换为 DelegateForest<V, E>
)并且我希望在森林的每个树组件上执行我的算法,我得到一个 ClassCastException 指出我无法从 DelegateTree<V, E>
转换至DelegateForest<V, E>
.
这是我的一些代码:ArrayList<Forest<String, Integer>> treeComps = new ArrayList<Forest<String, Integer>>(forest.getTrees());
第一行只是将森林的树组件存储到 ArrayList 中。
((DelegateForest)forest).removeVertex(vertexCentralities.first().getKey(), false);
此转换来 self 的算法,该算法删除树中的一个顶点,并保留该顶点的子树。这就是为什么我需要强制转换为 DelegateForest<V, E>
- 如何从森林中提取树木,使树木的类型为
Forest<V,E>
这样我就可以向DelegateForest<V, E>
求助后来没有问题吗? - 我需要修改源代码吗?
- 还有其他想法吗?
最佳答案
您不能将 DelegateTree
转换为 DelegateForest
,反之亦然,但是您可以将它们都转换为 Forest
,因为它们都实现该接口(interface)。
由于您的算法采用Forest
,我希望您可以使用delegateForest.getTrees()
调用以下方法。由于接口(interface)上未指定两个参数 removeVertex(..., ...)
方法,最简单的解决方案可能是受到 DelegateForest 上相应代码的启发
并在本地实现。
public void doAlgorithm( Collection<Tree<K,V>> trees )
{
for ( Tree<K,V> f : tree )
{
// algorithm here - tree is a Forest, and likely a DelegateTree
removeVertex( tree );
}
}
private removeVertex( Forest forest )
{
// As per implementation in DelegateForest...
}
干杯,
关于Java Jung 类型转换和 getTrees(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12973577/