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

从文本文件读取城市坐标并存储到二维数组的代码问题求助

问题分析与解决方案

首先,咱们来拆解下你代码里的核心问题:

  • 你错误地把文件开头的第一个点的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());
        }
    }
}

关键改进说明

  1. 匹配数据结构:按照[x1,y1,x2,y2,...,xn,yn]的实际格式,将每两个数作为一组坐标存储,不再错误使用前两个数作为数组行列。
  2. 动态统计数量:通过遍历文件统计总数字数,自动计算坐标点数量,避免硬编码长度导致的读取越界。
  3. 资源与异常处理:用完Scanner后及时关闭,添加文件未找到的异常捕获,让代码更健壮。
  4. 复用方法参数:现在方法接受外部传入的文件路径,无需修改代码即可读取不同文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 15:37:51