读取TXT文件至对象时ArrayList异常:末尾数组元素存入同一列表
解决读取TXT文件时ArrayList重复填充数据的问题
兄弟我太懂这种踩坑的感觉了——把TXT里[]包裹的最后一组整数映射到对象的ArrayList时,所有整数都堆进同一个列表里,十有八九是ArrayList的实例复用或者引用传递搞的鬼,我给你捋捋常见的问题和解决办法:
最常见的错误:循环外创建ArrayList,复用同一个引用
很多人会不小心把ArrayList的初始化放在读取循环外面,导致所有对象都共享同一个列表的引用,每次循环只是往同一个列表里加数据,最后所有对象的ArrayList都是最后一次循环后的完整数据。
举个错误示例:
// 错误!把列表初始化放在了循环外面 List<Integer> numList = new ArrayList<>(); // 读取文件的循环逻辑 while (reader.hasNextLine()) { String line = reader.nextLine(); // 解析当前行[]里的整数(假设你有解析逻辑) int[] parsedNums = parseNumbersInBrackets(line); // 把解析出的数加到列表里 for (int num : parsedNums) { numList.add(num); } // 创建对象并赋值 YourObject obj = new YourObject(); obj.setNumList(numList); // 所有对象都拿到同一个列表的引用 yourObjectList.add(obj); }
正确的做法:每次循环都创建新的ArrayList
只要把ArrayList的初始化放到循环内部,每次迭代都生成一个新的列表实例,就能保证每个对象都拥有独立的列表:
// 读取文件的循环逻辑 while (reader.hasNextLine()) { String line = reader.nextLine(); // 关键!每次循环都新建一个ArrayList List<Integer> numList = new ArrayList<>(); // 解析当前行[]里的整数 int[] parsedNums = parseNumbersInBrackets(line); for (int num : parsedNums) { numList.add(num); } // 创建对象并赋值独立的列表 YourObject obj = new YourObject(); obj.setNumList(numList); yourObjectList.add(obj); }
其他可能的坑点
对象类里的ArrayList是静态变量
如果你的YourObject类里把numList定义成了static List<Integer> numList;,那所有对象都会共享这个静态列表,不管你创建多少对象,数据都会往同一个列表里塞。赶紧把static去掉!解析逻辑错误,重复读取所有数据
检查你解析[]内整数的代码,比如用正则表达式的时候,是不是误写成了匹配所有[]内容,而不是当前行的[]块?比如正则用了\\[(.*?)\\]但没做行内匹配,导致每次都把整个文件里的[]内容都读出来了。
如果上面的解决办法还没搞定,把你的对象类代码和核心读取解析代码贴出来,我帮你精准定位问题~
内容的提问来源于stack exchange,提问作者Zuaro
相关产品推荐
相关产品推荐

