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
相关产品推荐
相关产品推荐

