Java中的数组列表出现问题(总是将最后一个元素放入数组中)

时间:2019-01-30 19:45:02

标签: java

我对数组列表有问题

public void loadFiles(String folder, List<MyFile> listFiles) {
       MyFile myfile = new MyFile();
        File directory = new File(folder);
        //get all the files from a directory
        File[] fList = directory.listFiles();
        for (File file : fList) {
            if (file.isDirectory()) {
                loadFiles(file.toString());
            }
            if (file.isFile()) {
                //set name and size to myfile
                myfile.setName(file.getName());
                myfile.setSize(file.length());
                listFiles.add(myfile);
            }
        }
    } 

在文件夹(Myfolder)上有3个文件(TC1,TC2,TC3)。 但在listFiles输出中(TC1,TC1,TC1) 发生了什么事解释了我。 以及如何解决此问题

谢谢

3 个答案:

答案 0 :(得分:0)

每次循环浏览文件时,都将同一对象添加到List中。您需要创建一个要添加的新文件,而不仅仅是每次更改myFile的名称:

if (file.isFile()) {
    //set name and size to NEW MyFile
    MyFile newFile = new MyFile();
    newFile .setName(file.getName());
    newFile .setSize(file.length());
    listFiles.add(newFile );
}

答案 1 :(得分:0)

感谢@Raj “在for循环内创建一个类似MyFile myfile = new MyFile();的新实例,然后将其添加到listFiles。当前,您只是多次添加同一对象。” –拉吉1分钟前

public void loadFiles(String folder, List<MyFile> listFiles) {
        File directory = new File(folder);
        //get all the files from a directory
        File[] fList = directory.listFiles();
        for (File file : fList) {
            **MyFile myfile = new MyFile();**
            if (file.isDirectory()) {
                loadFiles(file.toString());
            }
            if (file.isFile()) {
                //set name and size to myfile
                myfile.setName(file.getName());
                myfile.setSize(file.length());
                listFiles.add(myfile);
            }
        }
    }

有效。 谢谢大家。

答案 2 :(得分:0)

在您的示例中,您希望在列表中获得三个不同的文件实例,但是您只能创建一个-在代码中仅执行一次新的MyFile()。

因此您获得了对同一对象的三个引用。而且,每当通过myfile.setName(file.getName());myfile.setSize(file.length());更改该实例的属性时,您都会在引用该实例的所有位置看到该更改,因此在列表的所有三个位置都得到相同的结果。

代替

            myfile.setName(file.getName());
            myfile.setSize(file.length());

您应该做类似的事情

            myfile = new MyFile(file.getName(), file.length());

在循环内。