跳转至

用Java的Scanner和文本文件填充二维数组

简介

在Java编程中,从文本文件读取数据并填充到二维数组是一个常见的任务。这在处理矩阵数据、表格数据等场景中非常有用。本文将详细介绍如何使用Scanner类结合文本文件来实现二维数组的填充,包括基础概念、使用方法、常见实践以及最佳实践。

目录

  1. 基础概念
  2. 使用方法
  3. 常见实践
  4. 最佳实践
  5. 小结
  6. 参考资料

基础概念

二维数组

二维数组是一种多维数组,本质上是数组的数组。它可以用来表示矩阵、表格等结构的数据。在Java中,定义二维数组的方式如下:

int[][] twoDArray = new int[3][4];

这里定义了一个3行4列的二维整数数组。

Scanner类

Scanner类是Java标准库中的一个类,用于从输入源读取数据。它可以读取基本数据类型和字符串等。我们通常使用它来读取用户输入或文件中的数据。要使用Scanner类,需要导入java.util.Scanner包:

import java.util.Scanner;

文本文件

文本文件是以文本形式存储数据的文件。在我们的场景中,文本文件中的数据将被读取并填充到二维数组中。数据在文本文件中的格式需要符合一定的规则,以便正确地解析和填充到数组中。

使用方法

读取文本文件

首先,我们需要创建一个Scanner对象来读取文本文件。假设文本文件名为data.txt,代码如下:

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

public class Main {
    public static void main(String[] args) {
        try {
            File file = new File("data.txt");
            Scanner scanner = new Scanner(file);
            // 后续操作
            scanner.close();
        } catch (FileNotFoundException e) {
            System.out.println("文件未找到");
            e.printStackTrace();
        }
    }
}

在这段代码中,我们创建了一个File对象指向data.txt文件,然后用这个File对象创建Scanner对象。注意,在使用完Scanner后要调用close()方法关闭它,以释放资源。

填充二维数组

假设文本文件中的数据以每行表示二维数组的一行,数据之间用空格分隔。例如:

1 2 3
4 5 6
7 8 9

下面是填充二维数组的代码:

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

public class Main {
    public static void main(String[] args) {
        try {
            File file = new File("data.txt");
            Scanner scanner = new Scanner(file);
            int rows = 0;
            int cols = 0;
            // 确定行数和列数
            while (scanner.hasNextLine()) {
                rows++;
                String line = scanner.nextLine();
                Scanner lineScanner = new Scanner(line);
                while (lineScanner.hasNextInt()) {
                    cols = Math.max(cols, lineScanner.nextInt());
                }
                lineScanner.close();
            }
            scanner.close();

            int[][] twoDArray = new int[rows][cols];
            scanner = new Scanner(file);
            for (int i = 0; i < rows; i++) {
                String line = scanner.nextLine();
                Scanner lineScanner = new Scanner(line);
                for (int j = 0; j < cols; j++) {
                    if (lineScanner.hasNextInt()) {
                        twoDArray[i][j] = lineScanner.nextInt();
                    }
                }
                lineScanner.close();
            }
            scanner.close();

            // 打印二维数组
            for (int i = 0; i < rows; i++) {
                for (int j = 0; j < cols; j++) {
                    System.out.print(twoDArray[i][j] + " ");
                }
                System.out.println();
            }
        } catch (FileNotFoundException e) {
            System.out.println("文件未找到");
            e.printStackTrace();
        }
    }
}

在这段代码中,我们首先确定二维数组的行数和列数,然后创建二维数组并填充数据。最后,我们打印出填充后的二维数组以验证结果。

常见实践

处理不同的数据类型

上述示例处理的是整数类型的数据。如果文本文件中的数据是其他类型,如浮点数或字符串,只需相应地修改Scanner读取数据的方法。例如,读取浮点数:

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

public class Main {
    public static void main(String[] args) {
        try {
            File file = new File("data.txt");
            Scanner scanner = new Scanner(file);
            int rows = 0;
            int cols = 0;
            // 确定行数和列数
            while (scanner.hasNextLine()) {
                rows++;
                String line = scanner.nextLine();
                Scanner lineScanner = new Scanner(line);
                while (lineScanner.hasNextDouble()) {
                    cols = Math.max(cols, lineScanner.nextInt());
                }
                lineScanner.close();
            }
            scanner.close();

            double[][] twoDArray = new double[rows][cols];
            scanner = new Scanner(file);
            for (int i = 0; i < rows; i++) {
                String line = scanner.nextLine();
                Scanner lineScanner = new Scanner(line);
                for (int j = 0; j < cols; j++) {
                    if (lineScanner.hasNextDouble()) {
                        twoDArray[i][j] = lineScanner.nextDouble();
                    }
                }
                lineScanner.close();
            }
            scanner.close();

            // 打印二维数组
            for (int i = 0; i < rows; i++) {
                for (int j = 0; j < cols; j++) {
                    System.out.print(twoDArray[i][j] + " ");
                }
                System.out.println();
            }
        } catch (FileNotFoundException e) {
            System.out.println("文件未找到");
            e.printStackTrace();
        }
    }
}

处理不规则的文本文件格式

如果文本文件中的每行数据长度不一致,我们需要动态地处理列数。可以使用ArrayList来存储每行的数据,然后再转换为二维数组:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        try {
            File file = new File("data.txt");
            Scanner scanner = new Scanner(file);
            List<List<Integer>> list = new ArrayList<>();
            while (scanner.hasNextLine()) {
                String line = scanner.nextLine();
                Scanner lineScanner = new Scanner(line);
                List<Integer> row = new ArrayList<>();
                while (lineScanner.hasNextInt()) {
                    row.add(lineScanner.nextInt());
                }
                list.add(row);
                lineScanner.close();
            }
            scanner.close();

            int rows = list.size();
            int cols = 0;
            for (List<Integer> row : list) {
                cols = Math.max(cols, row.size());
            }

            int[][] twoDArray = new int[rows][cols];
            for (int i = 0; i < rows; i++) {
                List<Integer> row = list.get(i);
                for (int j = 0; j < row.size(); j++) {
                    twoDArray[i][j] = row.get(j);
                }
            }

            // 打印二维数组
            for (int i = 0; i < rows; i++) {
                for (int j = 0; j < cols; j++) {
                    System.out.print(twoDArray[i][j] + " ");
                }
                System.out.println();
            }
        } catch (FileNotFoundException e) {
            System.out.println("文件未找到");
            e.printStackTrace();
        }
    }
}

最佳实践

异常处理

在读取文件和解析数据时,要进行充分的异常处理。除了文件未找到异常FileNotFoundException,还可能会遇到数据格式不正确的异常,如InputMismatchException。可以使用try-catch块来捕获并处理这些异常:

import java.io.File;
import java.io.FileNotFoundException;
import java.util.InputMismatchException;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        try {
            File file = new File("data.txt");
            Scanner scanner = new Scanner(file);
            // 读取和填充二维数组的代码
            scanner.close();
        } catch (FileNotFoundException e) {
            System.out.println("文件未找到");
            e.printStackTrace();
        } catch (InputMismatchException e) {
            System.out.println("数据格式不正确");
            e.printStackTrace();
        }
    }
}

资源管理

确保及时关闭ScannerFile等资源,避免资源泄漏。可以使用try-with-resources语句来简化资源管理:

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

public class Main {
    public static void main(String[] args) {
        try (Scanner scanner = new Scanner(new File("data.txt"))) {
            // 读取和填充二维数组的代码
        } catch (FileNotFoundException e) {
            System.out.println("文件未找到");
            e.printStackTrace();
        }
    }
}

小结

通过Scanner类和文本文件填充二维数组在Java编程中是一项重要的技能。本文介绍了相关的基础概念、详细的使用方法、常见实践以及最佳实践。掌握这些知识和技巧,能够帮助你更高效地处理从文件读取数据并填充到二维数组的任务。

参考资料