You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:51:21