Java 如何从列表中存储的对象数组中获取每列值

Java 如何从列表中存储的对象数组中获取每列值,java,Java,我已将字符串值存储在对象数组中。完成后,我将对象添加到列表中,当我试图从列表中获取存储值时,我只获取最后一行。我使用了增强型for循环,将对象数组作为数据类型,并在右侧列出 import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.text.P

我已将
字符串
值存储在
对象
数组中。完成后,我将对象添加到列表中,当我试图从列表中获取存储值时,我只获取最后一行。我使用了增强型for循环,将
对象
数组作为数据类型,并在右侧列出

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.text.ParseException;
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[]>();
    Object[] received = new Object[3];
        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(">")){
                            String dat = data.substring(data.indexOf(" ")+1,data.indexOf("-")-1);
                            //System.out.println(dat);
                            Date date = sdf.parse(dat.substring(dat.indexOf(" "),dat.lastIndexOf(".")));
                            //System.out.println(date);
                            String timeFormat = parsingSdf.format(date);
                            //System.out.println(timeFormat);
                            received[0] = dat.substring(dat.indexOf("0"),dat.indexOf(" ")+1)+timeFormat;
                            //System.out.println(received[0]);
                            received[1] = data.substring(data.indexOf("<")+1,data.indexOf(",")-1);
                            //System.out.println(received[1]);
                            received[2] = data.substring(data.indexOf("Target"),data.lastIndexOf("."));
                            //System.out.println(received[2]);
                            list.add(received);
                        }
                    }

                }

            }

            for(Object[] data : list){
                System.out.println("-->  " +data[0]+" "+data[1]+" "+data[1]);
                //Unable to get all datas it is printing only last row from file
            }
        }catch(Exception e){
            e.printStackTrace();
        }
            }
        }

预期的输出不是从输入文件中打印最后一行值三次,而是从文件中获取每行的实际值。

每次添加到arraylist时,初始化对象“已接收”


ie放置你的对象[]已接收=新对象[3];内部if语句

每次添加到arraylist时初始化对象“已接收”



ie放置你的对象[]已接收=新对象[3];在if语句中

首先,在for循环打印中有两次数据[1]-正确吗?是的,我有以及我能够从文件中获得的所有值,我面临的唯一问题是,当从列表中获取时,该列表将所有值作为对象保存在try块的末尾,我使用了增强for循环打印,这就是我无法计算@JGFMK rest all working fine的地方。你不需要0,1和2吗?不是0,1和1吗?我需要接收[0],1和2@JGFMK和我刚刚了解了arraylist的声明,它应该在while循环中,然后只有当从文件中拆分字符串时出现新值时,它才会创建新对象。您可能有多个问题,但我立即发现了我提到的问题。首先,您有数据[1]在for循环中打印两次-正确吗?是的,我有和我能从文件中获得的所有值,我面临的唯一问题是,当从列表中获取时,该列表将所有值作为对象保存在try块的末尾,我使用了增强for循环打印,这就是我无法计算@JGFMK rest all working fine的地方。你不需要0,1和2吗?不是0,1和1吗?我需要接收[0],1和2@JGFMK和我刚刚了解了arraylist的声明,它应该在while循环中,然后只有当从文件中拆分字符串时新值到达时,它才会创建新对象。您可能有多个问题,但我立即发现了我提到的问题。有不止一个
if
语句。它需要放在最里面的一个里面。非常感谢。。!!是的,我首先找到了这个问题的原因。在必要的时候,通过创建一次
received
,将它的通用性降低是错误的,您只需为每个输入行编写相同的数组,并将多个引用添加到
列表中即可。它最终看起来像三个条目,所有条目看起来都像最后一行;它实际上是对完全相同的数组对象的三个引用,数组被每一行输入相继覆盖,因此它们最终看起来都像最后一个输入。现在可以声明已经得到声明的位置。关键是在开始处理每一个新的输入行之前为它分配一个
新对象[3]
,这样你就不会对所有输入都使用相同的对象数组。我只建议将声明移到最里面的
if
中,因为它最接近你实际使用
接收的
。但实际上,只要在循环输入的
语句中为其分配
新对象[3]
(可能在
if
中,可能在之前…),您就是黄金,有不止一个
if
语句。它需要放在最里面的一个里面。非常感谢。。!!是的,我首先找到了这个问题的原因。在必要的时候,通过创建一次
received
,将它的通用性降低是错误的,您只需为每个输入行编写相同的数组,并将多个引用添加到
列表中即可。它最终看起来像三个条目,所有条目看起来都像最后一行;它实际上是对完全相同的数组对象的三个引用,数组被每一行输入相继覆盖,因此它们最终看起来都像最后一个输入。现在可以声明已经得到声明的位置。关键是在开始处理每一个新的输入行之前为它分配一个
新对象[3]
,这样你就不会对所有输入都使用相同的对象数组。我只建议将声明移到最里面的
if
中,因为它最接近你实际使用
接收的
。但实际上,只要在循环输入的
语句中为其分配
新对象[3]
,就可以了,
(14581907) 06/29/2013 09:11.11.594 -->Successful password change for user=<U098095>, Password Target=<DOW>.
(14856413) 06/30/2013 21:39.35.837 -->Successful password change for user=<U545711>, Password Target=<a19mvs.nam.dow.com>.
(14858306) 06/30/2013 21:55.14.121 -->Successful password change for user=<NG34811>, Password Target=<a19mvs.nam.dow.com>.
-->  06/30/2013 09:07.14 PM NG34811 NG34811
-->  06/30/2013 09:07.14 PM NG34811 NG34811
-->  06/30/2013 09:07.14 PM NG34811 NG34811