从文本文件读取城市坐标并存储到二维数组的代码问题求助
问题分析与解决方案
首先,咱们来拆解下你代码里的核心问题:
- 你错误地把文件开头的第一个点的x、y坐标(401和841)当成了二维数组的行列数,这直接导致跳过了第一个有效坐标,而且后续的循环逻辑完全不符合数据结构——你的数据是成对出现的坐标(每两个数一组),而非x行y列的矩阵。
- 方法参数
String file没有被实际使用,而是硬编码了文件路径,降低了代码灵活性。 - 当文件内数字数量和你预设的
x*y不匹配时,Scanner会抛出异常,无法自动停止读取。
修正后的代码
这里提供两种实用的实现方式,你可以根据需求选择:
方式一:先收集所有数据再分组(灵活适配任意数量的坐标)
这种方式不需要提前知道坐标点总数,兼容性更强:
import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class CoordinateReader { public static float[][] readFile(String filePath) throws FileNotFoundException { File coordinateFile = new File(filePath); Scanner scanner = new Scanner(coordinateFile); // 先把所有数值收集到列表里 List<Integer> allNumbers = new ArrayList<>(); while (scanner.hasNextInt()) { allNumbers.add(scanner.nextInt()); } scanner.close(); // 每两个数一组,组成(x,y)坐标 int pointCount = allNumbers.size() / 2; float[][] coordinates = new float[pointCount][2]; for (int i = 0; i < pointCount; i++) { coordinates[i][0] = allNumbers.get(2 * i); // 取第2i个元素作为x坐标 coordinates[i][1] = allNumbers.get(2 * i + 1); // 取第2i+1个元素作为y坐标 // 打印验证结果 System.out.printf("坐标点 %d: (%.0f, %.0f)%n", i+1, coordinates[i][0], coordinates[i][1]); } return coordinates; } public static void main(String[] args) { try { String path = "C:\\Users\\hasan\\Downloads\\Bahcesehir University\\Year 3\\Semester 2\\Formal Languages and Automa Theory\\Project\\att48_xy.txt"; readFile(path); } catch (FileNotFoundException e) { System.err.println("文件未找到:" + e.getMessage()); } } }
方式二:逐组读取坐标(适合确认数据严格成对的场景)
如果能保证文件内数字是严格两两成对的,也可以直接逐组读取:
import java.io.File; import java.io.FileNotFoundException; import java.util.Scanner; public class CoordinateReader { public static float[][] readFile(String filePath) throws FileNotFoundException { File coordinateFile = new File(filePath); // 先统计总数字数,计算坐标点数量 Scanner countScanner = new Scanner(coordinateFile); int totalNumbers = 0; while (countScanner.hasNextInt()) { countScanner.nextInt(); totalNumbers++; } countScanner.close(); int pointCount = totalNumbers / 2; // 重新创建Scanner读取坐标 Scanner scanner = new Scanner(coordinateFile); float[][] coordinates = new float[pointCount][2]; for (int i = 0; i < pointCount; i++) { coordinates[i][0] = scanner.nextInt(); coordinates[i][1] = scanner.nextInt(); System.out.printf("坐标点 %d: (%.0f, %.0f)%n", i+1, coordinates[i][0], coordinates[i][1]); } scanner.close(); return coordinates; } public static void main(String[] args) { try { String path = "C:\\Users\\hasan\\Downloads\\Bahcesehir University\\Year 3\\Semester 2\\Formal Languages and Automa Theory\\Project\\att48_xy.txt"; readFile(path); } catch (FileNotFoundException e) { System.err.println("文件未找到:" + e.getMessage()); } } }
关键改进说明
- 匹配数据结构:按照
[x1,y1,x2,y2,...,xn,yn]的实际格式,将每两个数作为一组坐标存储,不再错误使用前两个数作为数组行列。 - 动态统计数量:通过遍历文件统计总数字数,自动计算坐标点数量,避免硬编码长度导致的读取越界。
- 资源与异常处理:用完
Scanner后及时关闭,添加文件未找到的异常捕获,让代码更健壮。 - 复用方法参数:现在方法接受外部传入的文件路径,无需修改代码即可读取不同文件。
内容的提问来源于stack exchange,提问作者Farhan Hasan
相关产品推荐
相关产品推荐

