为何无法使用for循环为图的节点和边输入数据?
为啥没法用for循环给图的节点和边输入数据?
嘿,我来帮你搞懂这个问题!先看你现在的代码,你是用数组初始化器直接写死了几条边:
Graph.Edge[] GRAPH = { new Graph.Edge(sc.next(), sc.next(), sc.nextInt()), // ... 硬编码的元素 };
这种写法只能在声明数组的瞬间一次性把所有元素塞进去,根本没法插循环逻辑。如果想用for循环动态输入n条边,得换个思路来写:
正确的实现方式
分两步走就搞定了:
- 先根据输入的边数
n,创建一个指定长度的Graph.Edge数组 - 用for循环遍历数组,逐个输入数据并创建
Graph.Edge实例
修改后的完整代码大概是这样:
import java.util.*; public class Dijkstra { // 节点映射注释保留 // 去掉final,因为要动态赋值数组 private static Graph.Edge[] GRAPH; public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.print("请输入边的数量:"); int n = sc.nextInt(); sc.nextLine(); // 吃掉换行符,避免后续next()读错 // 第一步:创建指定长度的数组 GRAPH = new Graph.Edge[n]; // 第二步:用for循环逐个输入边的数据 for (int i = 0; i < n; i++) { System.out.print("请输入第" + (i+1) + "条边的起点、终点、权重:"); String start = sc.next(); String end = sc.next(); int weight = sc.nextInt(); GRAPH[i] = new Graph.Edge(start, end, weight); } // 可以加个验证,打印所有边看看 for (Graph.Edge edge : GRAPH) { System.out.println(edge.start + " -> " + edge.end + ",权重:" + edge.weight); } } } // 得确保你的Graph类里有这个Edge内部类哦 class Graph { static class Edge { String start; String end; int weight; Edge(String start, String end, int weight) { this.start = start; this.end = end; this.weight = weight; } } }
关键问题点解释
- 你原来的写法是数组初始化表达式,这种语法只能在声明数组变量的时候用,而且里面只能放具体的元素,不能嵌套循环这种逻辑代码。
- 要动态生成数组元素,必须先创建一个空数组(指定好长度),然后通过数组下标
GRAPH[i]逐个赋值,这时候for循环就能派上用场啦。 - 另外注意:你之前在类里声明的
private static final Graph.Edge[] GRAPH = null;,得去掉final修饰符——final变量一旦赋值就不能改引用了,我们要给它重新赋值为新创建的数组,所以final必须去掉。
小提示
- 用
Scanner的时候,nextInt()只会读取数字,不会读取后面的换行符,所以之后用next()之前最好调用sc.nextLine()清空缓冲区,不然可能会读到空字符串哦。 - 如果你的节点是用数字(比如1代表A)输入的,完全可以把
start和end改成int类型,更贴合你注释里的节点映射~
内容的提问来源于stack exchange,提问作者TimothyW553
相关产品推荐
相关产品推荐

