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

Java中如何用文本文件字符串替代整数作为邻接图节点标识

解决方案:把Java邻接图的整数节点换成字符串标识

我明白你想要把图里的整数节点ID替换成从names.txt读取的字符串名字,核心思路是建立字符串和数组索引的双向映射——既能用字符串操作节点,又能复用原来的数组邻接表结构。下面是修改后的完整代码,以及关键改动的说明:

import java.util.*;
import java.io.File;
import java.io.FileNotFoundException;

class Graph1 {
    class Edge {
        String v;
        public Edge(String v) {
            this.v = v;
        }
        public String toString() {
            return "(" + v + ")";
        }
    }

    List<Edge> G[];
    private Map<String, Integer> nameToIndex;
    private String[] nodeNames;

    // 构造函数:通过名字列表初始化图
    public Graph1(List<String> nodeNames) {
        this.nodeNames = nodeNames.toArray(new String[0]);
        nameToIndex = new HashMap<>();
        for (int i = 0; i < nodeNames.size(); i++) {
            nameToIndex.put(nodeNames.get(i), i);
        }

        // 初始化邻接表
        G = new LinkedList[nodeNames.size()];
        for (int i = 0; i < G.length; i++) {
            G[i] = new LinkedList<Edge>();
        }
    }

    // 检查两个字符串节点是否连通
    boolean isConnected(String u, String v) {
        Integer uIndex = nameToIndex.get(u);
        if (uIndex == null) return false; // 节点不存在直接返回false

        for (Edge edge : G[uIndex]) {
            if (edge.v.equals(v)) { // 注意用equals比较字符串,不要用==
                return true;
            }
        }
        return false;
    }

    // 添加边:从u节点指向v节点
    void addEdge(String u, String v) {
        Integer uIndex = nameToIndex.get(u);
        if (uIndex == null) {
            System.out.println("节点 " + u + " 不存在,无法添加边");
            return;
        }
        // 可选:检查v是否是合法节点
        if (!nameToIndex.containsKey(v)) {
            System.out.println("节点 " + v + " 不存在,无法添加边");
            return;
        }
        G[uIndex].add(0, new Edge(v));
    }

    @Override
    public String toString() {
        StringBuilder result = new StringBuilder();
        for (int i = 0; i < G.length; i++) {
            result.append(nodeNames[i]).append("=>").append(G[i]).append("\n");
        }
        return result.toString();
    }
}

public class GraphExample {
    public static void main(String[] args) {
        // 读取names.txt中的节点名字
        List<String> nodeNames = new ArrayList<>();
        try {
            Scanner scanner = new Scanner(new File("names.txt"));
            while (scanner.hasNext()) {
                nodeNames.add(scanner.next());
            }
            scanner.close();
        } catch (FileNotFoundException e) {
            System.out.println("未找到names.txt文件:" + e.getMessage());
            return;
        }

        // 初始化图
        Graph1 g = new Graph1(nodeNames);
        g.addEdge("Peter", "Simon");
        g.addEdge("Peter", "Peter"); // 示例自环,可按需调整
        g.addEdge("Mark", "Matthew");
        g.addEdge("Luke", "Mark"); // 替换原代码中越界的9,改用合法节点Luke
        // 测试无效节点
        g.addEdge("InvalidNode", "Simon");

        System.out.println(g);
        System.out.println(g.isConnected("Simon", "Peter"));
        System.out.println(g.isConnected("Mark", "Matthew"));
    }
}

关键改动说明

  • 读取文件+双向映射:用Scanner读取names.txt的名字,通过Map<String, Integer>把名字转成数组索引,用nodeNames数组把索引转回名字,解决整数和字符串的转换问题。
  • 修正字符串比较:原代码中用==比较字符串是错误的,改成equals()保证正确性。
  • 节点合法性检查:添加了节点存在性校验,避免原代码中addEdge(9, "Mark")这种越界操作。
  • 输出适配:toString()方法里用nodeNames[i]替换原来的整数i,实现字符串节点标识的展示。

内容的提问来源于stack exchange,提问作者CodingIsHardMan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:51:33