You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何无法使用for循环为图的节点和边输入数据?

为啥没法用for循环给图的节点和边输入数据?

嘿,我来帮你搞懂这个问题!先看你现在的代码,你是用数组初始化器直接写死了几条边:

Graph.Edge[] GRAPH = {
    new Graph.Edge(sc.next(), sc.next(), sc.nextInt()),
    // ... 硬编码的元素
};

这种写法只能在声明数组的瞬间一次性把所有元素塞进去,根本没法插循环逻辑。如果想用for循环动态输入n条边,得换个思路来写:

正确的实现方式

分两步走就搞定了:

  1. 先根据输入的边数n,创建一个指定长度的Graph.Edge数组
  2. 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:18:20