如何用Java读取文本文件并将内容存入二维列表?
实现Java读取文本内容到二维列表的方案
Got it, let's fix this so you can store your numbers into a 2D list instead of a flat one. First, let's break down the problem: your text file has groups separated by spaces (like 1,2,3 and 4,5,6,7), with numbers in each group separated by commas. Your original code uses commas as the only delimiter, so it's pulling all numbers into a single list. We need to split first by spaces to get each group, then split each group by commas to get individual numbers.
修改后的完整代码
import java.io.*; import java.util.*; public class Findcycle { // 定义两个分隔符:空格区分数字组,逗号区分组内数字 private final static String GROUP_DELIMITER = " "; private final static String NUM_DELIMITER = ","; private final static String filePath = "D:\\1.txt"; public static void main(String[] args) { File inputFile = new File(filePath); // 换成二维列表:外层存所有数字组,内层存每组的数字 ArrayList<ArrayList<Integer>> numberGroups = new ArrayList<>(); try { Scanner scanner = new Scanner(inputFile); // 先按空格拆分,读取每个数字组的字符串(比如"1,2,3") scanner.useDelimiter(GROUP_DELIMITER); while(scanner.hasNext()) { String currentGroup = scanner.next(); ArrayList<Integer> singleGroup = new ArrayList<>(); // 针对当前组,用逗号拆分数字 Scanner numScanner = new Scanner(currentGroup); numScanner.useDelimiter(NUM_DELIMITER); // 直接读取整数,省去字符串转int的步骤 while(numScanner.hasNextInt()) { singleGroup.add(numScanner.nextInt()); } numScanner.close(); // 关闭内层扫描器,避免资源泄漏 // 跳过空分组(比如文本首尾有空格的情况) if(!singleGroup.isEmpty()) { numberGroups.add(singleGroup); } } scanner.close(); // 可以加个测试输出,验证结果 for(ArrayList<Integer> group : numberGroups) { System.out.println("当前数字组:" + group); } } catch (FileNotFoundException e) { e.printStackTrace(); } } }
关键改动说明
- 分隔符拆分逻辑:把原来单一的逗号分隔符拆成两个——用空格区分不同的数字组,用逗号区分组内的每个数字,这样能准确识别分组边界。
- 存储结构升级:把
ArrayList<Integer>改成ArrayList<ArrayList<Integer>>,外层列表管理所有分组,内层列表存储每组的数字,完美对应你的二维需求。 - 双层扫描器处理:外层扫描器负责读取每个分组字符串,内层扫描器专门处理当前分组的数字拆分,逻辑清晰且避免混乱。
- 空分组过滤:增加了对空分组的判断,防止文本中多余的空格生成空列表,保证数据整洁。
- 高效读取整数:直接使用
hasNextInt()和nextInt()读取数字,省去了Integer.parseInt()的手动转换,代码更简洁高效。
额外说明
如果你的文本是按换行来划分数字组的(比如每行一组),只需要把GROUP_DELIMITER改成System.lineSeparator(),或者直接用scanner.nextLine()读取每行,逻辑和上面的代码一致,只需要调整外层读取方式即可。
内容的提问来源于stack exchange,提问作者Jess Brown
相关产品推荐
相关产品推荐

