如何将文本文件中的数值存入Java ArrayList矩阵?
问题分析与解决
你的核心问题是构建矩阵时,每行都重复读取了相同的元素。原代码内层循环固定从索引1到dimension取值,导致所有行都是第一行的数据。
修正思路
文本文件的结构是:第一行是矩阵维度N,接下来N行每行有N个数值。读取到numbers列表后,数据顺序为:[4, 0,24,12,52, 24,0,16,23, 12,16,0,18, 52,23,18,0]。要构建N×N矩阵,第j行(从0开始)的元素应该是numbers中从1 + j*N开始的连续N个元素。
修正后的代码
import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.StringTokenizer; public class Siti { public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new FileReader("C://Users//dbruschi//Java-projects//NodiTelefonici//nodi.txt")); String line; ArrayList<Integer> numbers = new ArrayList<>(); while ((line = reader.readLine()) != null) { StringTokenizer token = new StringTokenizer(line); while (token.hasMoreTokens()) { int num = Integer.parseInt(token.nextToken()); numbers.add(num); } } reader.close(); // 释放流资源 System.out.println(numbers); int dimension = numbers.get(0); System.out.println("The dimension is: " + dimension); ArrayList<ArrayList<Integer>> matrix = new ArrayList<>(); for(int j = 0; j < dimension; j++) { ArrayList<Integer> matrixRow = new ArrayList<>(); // 计算当前行起始索引:跳过第一个维度元素,加上当前行的偏移量 int startIndex = 1 + j * dimension; for (int i = 0; i < dimension; i++) { int elem = numbers.get(startIndex + i); matrixRow.add(elem); } matrix.add(matrixRow); } System.out.println(matrix); } }
关键修改点
- 计算每行起始索引
startIndex = 1 + j * dimension:跳过列表第一个元素(矩阵维度),根据行号j计算偏移量,确保每行取到对应位置的元素。 - 内层循环从0到
dimension-1,通过startIndex + i定位当前行的每个元素。 - 添加
reader.close()确保流资源被正确释放。
运行修正后的代码,输出会是:
[[0, 24, 12, 52], [24, 0, 16, 23], [12, 16, 0, 18], [52, 23, 18, 0]]
内容的提问来源于stack exchange,提问作者Bruda
相关产品推荐
相关产品推荐

