关于java编程的小问题
来源:10-1 总结,算法思想,大家加油
慕勒7399318
2020-03-29
你好老师,听了几个你的课程,收货颇多,表示感谢,这里我有两个关于java编程中的问题。具体代码我只是截取了其中的部分。
1、进行edgTo=(Weight[]) new Object[V];运行的时候报错,提示跟Weight extends Comparable相关;
2、本意的操作是判断edgeTo.get(v) + e.wt()) < edgeTo.get(w))是否成立,结果我代码的具体实现使用了如下代码的方式,用了一个融合器,但是感觉这样写起来较复杂,请问下有没有更简便的代码写法呢。
public class BellmanFord<Weight extends Comparable<Weight>> {
// 设置几个辅助的工具
private Weight[] edgeTo; // edgTo[i]表示从源点到达顶点i所经过的权重和
public BellmanFord(Graph<Weight>graph, int s, Merger<Weight> merger){
if(from[w] == null || merger.merge(edgeTo.get(v), e.wt()).compareTo(edgeTo.get(w)) < 0){
edgeTo.set(w, merger.merge(edgeTo.get(v), e.wt()));
from[w] = e;
}
}
}
1回答
-
我没有更好的方式,这在我看来是 Java 的历史遗留问题。当涉及静态数组和泛型的时候,Java 就是这么复杂。(虽然 C++ 也没简单到哪里去,但是我认为 C++ 比 Java 灵活多了,虽然这意味着 undefined behavior 和潜在的更多 bug。。。)
至于你说的融合器,我认为是很好的方式。因为 Java 本身不支持运算符重载,所以只能套在函数里。。。
我的代码选择使用 Number 接口解决这一问题。不一定是万全之策,但可以参考:https://github.com/liuyubobobo/Play-with-Algorithms/blob/master/09-Shortest-Path/Course%20Code%20(Java)/05-Implementation-of-Bellman-Ford/src/bobo/algo/BellmanFord.java
wishing我觉得在这个课程中,我选择让图的权值是一个泛型,稍微有一些过设计。同时从算法讲解的角度看,会有很多代码处理这个泛型,而阻碍大家思考算法本身。因此,我在我的专门讲解图论的课程中,统一让图的权值是 double,代码能简化很多,而且对于 99% 的场景,都是适用的。有兴趣可以参考:https://coding.imooc.com/class/370.html
继续加油!:)
00
相似问题