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