关于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回答

liuyubobobo

2020-03-30

我没有更好的方式,这在我看来是 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


继续加油!:)

0
0

算法与数据结构(C++版) 面试/评级的算法复习技能包

课程专为:短时间内应对面试、升职测评等艰巨任务打造

11187 学习 · 1614 问题

查看课程