如何从List的Object数组取各列值及解决重复输出最后行问题
问题分析与解决方案:ArrayList中仅显示最后一行数据的问题
嘿,我一眼就看出你代码里的问题啦!你现在遇到的这个“遍历List全是最后一行数据”的坑,其实是Java引用类型的经典陷阱哦~
问题根源
你在代码里只创建了一个Object[] received数组对象,然后在循环读取每行数据的时候,只是不断修改这个数组里的元素值,接着把这个数组的引用添加到ArrayList中。这就导致List里所有的元素其实都是指向同一个数组对象的引用——当你最后一次修改数组内容后,所有引用指向的都是这个最终修改后的数组,所以遍历的时候自然全是最后一行的数据啦。
解决方案
很简单,只需要把创建数组的代码移到while循环内部,每处理一行数据就新建一个Object数组。这样每一行的数据都会存储在独立的数组对象里,添加到List中的是不同的数组引用,就不会出现覆盖的问题了。
修改后的完整代码
import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; public class ReportOne{ public static String input_path = ("C:\\Users\\RAVI\\Desktop\\Skills\\inputs"); public static String output_path = ("C:\\Users\\RAVI\\Desktop\\Skills\\outputs"); static BufferedReader br; public static void main(String[] args) { SimpleDateFormat sdf = new SimpleDateFormat("hh:MM.ss"); SimpleDateFormat parsingSdf = new SimpleDateFormat("hh:MM.ss a"); ArrayList<Object[]> list= new ArrayList<Object[]>(); try{ File fi = new File(input_path); File[] fileCount = fi.listFiles(); for(int i = 0;i<fileCount.length;i++){ File file = fileCount[i]; if(file.isFile()){ System.out.println("Total file count : "+fileCount.length); String fileName = file.getName(); System.out.println("File name : "+fileName); String data; br = new BufferedReader(new FileReader(input_path+"\\"+fileName)); while((data = br.readLine())!=null){ if(data.contains(">")){ // 关键修改:把数组创建移到循环内部,每行对应一个新数组 Object[] received = new Object[3]; String dat = data.substring(data.indexOf(" ")+1,data.indexOf("-")-1); Date date = sdf.parse(dat.substring(dat.indexOf(" "),dat.lastIndexOf("."))); String timeFormat = parsingSdf.format(date); received[0] = dat.substring(dat.indexOf("0"),dat.indexOf(" ")+1)+timeFormat; received[1] = data.substring(data.indexOf("<")+1,data.indexOf(",")-1); received[2] = data.substring(data.indexOf("Target"),data.lastIndexOf(".")); list.add(received); } } } } for(Object[] data : list){ // 这里修正了你原来重复写data[1]的问题,改成data[2]显示Target内容 System.out.println("--> " +data[0]+" "+data[1]+" "+data[2]); } }catch(Exception e){ e.printStackTrace(); } } }
另外还要提醒你一下,你原来的遍历输出里写了两次data[1],我已经改成data[2]了,这样就能正确显示每行的Target内容,和你的期望输出一致~
内容的提问来源于stack exchange,提问作者Rocket_03
相关产品推荐
相关产品推荐

