为什么只添加arraylist的最后一个元素?或可能的解决方案

时间:2014-11-25 19:53:07

标签: java

在第一个循环中,我循环遍历变量rgname,即[Monthly,Quarterly,Yearly]。现在,我创建了另一个名为listDir的方法。如果我在这里传递变量值folder = new File(reportFolderPath + reportPath +“/”+ rgname);然后到方法listDir,它将返回如下所示的数组列表。

           List<ReportGroup> reportGroupList = new ArrayList<ReportGroup>();
            for (String rgname : reportGroupNames) {
                ReportGroup rg = new ReportGroup();
                rg.setReportGroupName(rgname);// Report Name such as
                                                // Monthly,Quarterly and
                                                // Yearly

                folder = new File(reportFolderPath + reportPath + "/"+ rgname);

                List<ReportInfo> reportList = new ArrayList<ReportInfo>();
                List<String> reportDescription=listDir(folder);

                for(String reportDescr:reportDescription){
                    System.out.println("*****************Test***************" +reportDescr);
                    rg.setReportDescr(reportDescr);
                }  
                    rg.setReportList(reportList);

                reportGroupList.add(rg);

            report.setReportGroupList(reportGroupList);
        }
    }

第二种方法返回arraylist:

    public static List<String> listDir(final File folder) {

    List<String> dirArray = new ArrayList<String>();
    for (final File fi : folder.listFiles()) {

        if (fi.isDirectory()) {

            dirArray.add(fi.getName());
        }
    }

    return dirArray;
}

输出应该是这样的:

     Monthly
           -Jan
           -Feb 
           -Continue
    Quarterly
           -First Quarter
           -Second continue

第二个方法返回此值,这是它在执行System.out.println(reportDescription)时打印的内容;

       [539_January_2013, 540_February_2013, 541_March_2013, 542_April_2013, 543_May_2013, 544_June_2013, 545_July_2013, 546_August_2013, 547_September_2013, 548_October_2013, 549_November_2013, 550_December_2013, 587_January_2014]

       [551_First_Quarter_2013, 554_Second_Quarter_2013, 557_Third_Quarter_2013, 560_Fourth_Quarter_2013]

       [123_Year_2010]

3 个答案:

答案 0 :(得分:2)

正如chat中所发现的那样,有问题的一行就是:

rg.setReportDescr(reportDescr);

正如我在之前的评论中所假设的,这个一个标准的setter方法,它将用新的数据覆盖旧数据。因此,最后剩余的数据是列表的最后一个元素:

public void setReportDescr(String reportDescr) {
    this.reportDescr = reportDescr;
}

解决此问题的一种简单方法是将整个列表传递给ReportGroup实例:

List<String> reportDescriptions=listDir(folder);
rg.setReportDescriptions(reportDescriptions); // changed method name a bit
rg.setReportList(reportList);
reportGroupList.add(rg);

在课程ReportGroup中,行String reportDescr;应更改为:

List<String> reportDescr;

应该相应地更改getter和setter方法:

public List<String> getReportDescriptions() { // changed method name a bit
    return reportDescr;
}

public void setReportDescriptions(List<String> reportDescr) { // changed method name a bit
    this.reportDescr = reportDescr;
} 

答案 1 :(得分:1)

所以修改后的代码是这样的:

System.out.println(reportDescription);
for(String reportDescr:reportDescription){
    System.out.println("*****************Test***************" +reportDescr);
    rg.setReportDescr(reportDescr);
}

所以它应该打印如下:

   [539_January_2013, 540_February_2013, 541_March_2013, 542_April_2013, 543_May_2013, 544_June_2013, 545_July_2013, 546_August_2013, 547_September_2013, 548_October_2013, 549_November_2013, 550_December_2013, 587_January_2014]
   *****************Test***************587_January_2014
   [551_First_Quarter_2013, 554_Second_Quarter_2013, 557_Third_Quarter_2013, 560_Fourth_Quarter_2013]
   *****************Test***************560_Fourth_Quarter_2013
   [123_Year_2010]
   *****************Test***************123_Year_2010

正确?

为什么你不能简单地添加所有信息?

答案 2 :(得分:1)

您的代码非常混乱!

我不确定这里的目标是什么,但似乎你正在覆盖文件夹,只有上个月被打印出来。您可以尝试每次创建一个新文件并将其添加到自己的列表中。然后你可以迭代。这里有一些代码,虽然它没有做你想做的事情,但你可以用它来告诉你下一步该做什么:

    List<String> monthsList = new ArrayList<String>();
    monthsList.add("January");
    monthsList.add("June");
    monthsList.add("December");

    List<File> folderList = new ArrayList<File>();
    for(String month : monthsList)
    {
        File folder = new File("C:\\temp\\"+month);
        if(!folder.exists())
        {
            folder.mkdir();
        }

        folderList.add(folder);
    }

    List<String> dirArray = new ArrayList<String>();
    for (final File fi : folderList)
    {
        if(fi.isDirectory())
        {
            dirArray.add(fi.getAbsolutePath());
        }
    }

    for(String directory : dirArray)
    {
        System.out.println("*****************Test***************\n" + directory);
    }