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

Java 为什么只添加arraylist的最后一个元素?还是可能的解决方案?,java,Java,在第一个循环中,我循环使用变量rgname,它是[每月、每季度、每年]。现在,我创建了另一个名为listDir的方法。如果我在这里传递变量值folder=new File(reportFolderPath+reportPath+“/”+rgname);稍后,对于方法listDir,它将返回数组列表,如下所示 List<ReportGroup> reportGroupList = new ArrayList<ReportGroup>();

在第一个循环中,我循环使用变量rgname,它是[每月、每季度、每年]。现在,我创建了另一个名为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);
        }
    }
第二个方法返回这个值,这是它在执行System.out.println(reportDescription)时打印的值


因此,您修改的代码如下:

System.out.println(reportDescription);
for(String reportDescr:reportDescription){
    System.out.println("*****************Test***************" +reportDescr);
    rg.setReportDescr(reportDescr);
}
rg.setReportDescr(reportDescr);
因此,它应该打印如下内容:

[539年1月、540年2月、541年3月、542年4月、543年5月、544年6月、545年7月、546年8月、547年9月、548年10月、549年11月、550年12月、587年1月]
*****************测试*******************587年1月
[2013年第一季度551,2013年第二季度554,2013年第三季度557,2013年第四季度560]
*****************测试******************560个单位2013年第四季度
[123年/2010年]
*****************测试******************123年2010年
对吧?


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

因此修改后的代码如下:

System.out.println(reportDescription);
for(String reportDescr:reportDescription){
    System.out.println("*****************Test***************" +reportDescr);
    rg.setReportDescr(reportDescr);
}
rg.setReportDescr(reportDescr);
因此,它应该打印如下内容:

[539年1月、540年2月、541年3月、542年4月、543年5月、544年6月、545年7月、546年8月、547年9月、548年10月、549年11月、550年12月、587年1月]
*****************测试*******************587年1月
[2013年第一季度551,2013年第二季度554,2013年第三季度557,2013年第四季度560]
*****************测试******************560个单位2013年第四季度
[123年/2010年]
*****************测试******************123年2010年
对吧?


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

您的代码非常混乱

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

    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);
    }
List monthsList=new ArrayList();
月清单。添加(“一月”);
月清单。添加(“六月”);
月清单。添加(“12月”);
List folderList=新建ArrayList();
用于(字符串月份:月列表)
{
文件夹=新文件(“C:\\temp\\”+月份);
如果(!folder.exists())
{
folder.mkdir();
}
添加(文件夹);
}
List dirArray=new ArrayList();
用于(最终文件fi:folderList)
{
if(fi.isDirectory())
{
添加(fi.getAbsolutePath());
}
}
for(字符串目录:dirArray)
{
System.out.println(“**********************测试************************\n”+目录);
}

您的代码非常混乱

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

    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);
    }
List monthsList=new ArrayList();
月清单。添加(“一月”);
月清单。添加(“六月”);
月清单。添加(“12月”);
List folderList=新建ArrayList();
用于(字符串月份:月列表)
{
文件夹=新文件(“C:\\temp\\”+月份);
如果(!folder.exists())
{
folder.mkdir();
}
添加(文件夹);
}
List dirArray=new ArrayList();
用于(最终文件fi:folderList)
{
if(fi.isDirectory())
{
添加(fi.getAbsolutePath());
}
}
for(字符串目录:dirArray)
{
System.out.println(“**********************测试************************\n”+目录);
}
正如在中所发现的,有问题的一行是:

System.out.println(reportDescription);
for(String reportDescr:reportDescription){
    System.out.println("*****************Test***************" +reportDescr);
    rg.setReportDescr(reportDescr);
}
rg.setReportDescr(reportDescr);
正如我在前面的评论中所假设的,这是一种标准设置方法,它将用新数据覆盖旧数据。因此,最后剩余的数据是列表的最后一个元素:

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);
并且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;
} 
public List getReportDescriptions(){//稍微更改了方法名
返回报告描述;
}
public void setReportDescriptions(List reportDescr){//稍微更改了方法名
this.reportDescr=reportDescr;
} 
正如在中所发现的,有问题的一行是:

System.out.println(reportDescription);
for(String reportDescr:reportDescription){
    System.out.println("*****************Test***************" +reportDescr);
    rg.setReportDescr(reportDescr);
}
rg.setReportDescr(reportDescr);
正如我在前面的评论中所假设的,这是一种标准设置方法,它将用新数据覆盖旧数据。因此,最后剩余的数据是列表的最后一个元素:

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);
并且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;
} 
public List getReportDescriptions(){//稍微更改了方法名
返回报告描述;
}
public void setReportDescriptions(List reportDescr){//稍微更改了方法名
this.reportDescr=reportDescr;
} 

我试过了,我把系统关掉,我只看到一条记录,这是最后一个元素。你能提供一个?哪个循环?这个:
用于(字符串reportDescr:reportDescription)
?如果它只打印最后一个元素,你怎么知道它包含的不止这些?或者只是
System.out.println(reportDescription)。这会打印出整个列表的内容,但没有任何意义。如果将
System.out.println(reportDescription)
放在
for
循环的
正上方,并且它包含所有内容,则此测试打印
System.ou是不可能的