【问题标题】:How to compare an arraylist<string> with an arraylist<file> in Java? [closed]如何在 Java 中将 arraylist<string> 与 arraylist<file> 进行比较? [关闭]
【发布时间】:2013-10-18 02:15:38
【问题描述】:

我有以下代码:

ArrayList<String> File_name = new ArrayList<String>();

    try {
        //Reading an XML file, created above
        File fXmlFile = new File("C:\\Users\\V\\Documents\\diplwmatiki\\temp\\dokimi.xml");
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(fXmlFile);

        //optional, but recommended
        //read this - http://stackoverflow.com/questions/13786607/normalization-in-dom-parsing-with-java-how-does-it-work
        doc.getDocumentElement().normalize();

        //Printing the attributes of the XML file
        System.out.println("\nRoot element :" + doc.getDocumentElement().getNodeName());

        NodeList nList = doc.getElementsByTagName("element");

        System.out.println("----------------------------");

        for (int temp = 0; temp < nList.getLength(); temp++) {

            Node nNode = nList.item(temp);

            System.out.println("\nCurrent Element :" + nNode.getNodeName());

            if (nNode.getNodeType() == Node.ELEMENT_NODE) {

                Element eElement = (Element) nNode;

                System.out.println("element : " + eElement.getAttribute("id"));
                System.out.println("File_name : " + eElement.getElementsByTagName("name").item(0).getTextContent());
                File_name.add(eElement.getElementsByTagName("name").item(0).getTextContent());

            }

        }


    }

        catch (Exception e) {
        e.printStackTrace();
        }

    System.out.println("\n");
    System.out.println(File_name); 
    System.out.println("\n");

    //Creating an list having all files of a directory

    String path = "C:\\Users\\V\\Documents\\diplwmatiki\\SFBs"; 

    String files;
    File folder = new File(path);
    File[] listOfFiles = folder.listFiles(); 

    for (int i = 0; i < listOfFiles.length; i++) 
    {

        if (listOfFiles[i].isFile()) 
        {
            files = listOfFiles[i].getName();
            System.out.println(files);
        }
    }

我想比较使用files.retainAll(File_name); 创建的两个ArrayLists,因为我需要保留第二个列表中的文件,它们的名称作为字符串存在于第一个列表中。 RetainAll(); 不起作用,因为它们是两种不同的类型:StringFile。我正在尝试制作如下所示的过滤器,但出现语法错误,当我尝试纠正它们时似乎不起作用。这是过滤器:

String[] myFiles = folder.list(new FilenameFilter(){


        for (int i=0; i < listOfFiles.length; i++){


            public boolean accept;File folder; String fileName;{ 
                return fileName.startsWith(File_name[i]);
                System.out.println(folder);

            }


        });

在第一行和最后一行插入或删除标记时出现错误。我不在此过滤器中使用retainAll()。 抱歉发了这么长的帖子,谢谢!

【问题讨论】:

    标签: java file arraylist


    【解决方案1】:

    您至少可以通过两种方式做到这一点,使用File.getName()

    1. 只需遍历您的列表并将您的 String 名称与在第二个列表中的 File 元素上调用 getName() 进行比较。
    2. 或者从您的文件名中创建另一个列表,从而生成另一个String 列表,然后然后使用retainAll()

    【讨论】:

    • 也许我没有正确表达我的问题。我认为这回答了相反的问题。我的意思是按照上面的方法,retainAll() 会得到字符串,而不是文件。但我需要使用retainAll() 获取文件。无论如何,谢谢!
    【解决方案2】:

    首先,鉴于其当前结构,您的代码根本无法工作。当您调用 files.retainAll(File_name); 时,File_name 将不存在此外,以大写字母开头的变量也是不好的做法。也就是说,一旦修复,您可以执行以下操作,将所有保留的文件放在新的 ArrayList 中:

    ArrayList<File> retainedFiles = new ArrayList<File>();
    for (int i = 0; i < listOfFiles.length; i++) {
        if (listOfFiles[i].isFile())  {
            files = listOfFiles[i].getName();
            if (File_name.contains(files))
                retainedFiles.add(listOfFiles[i]);
        }
    }
    

    (已编辑以反映以下评论)

    【讨论】:

    • 好的,我更正了 File_name 以便在 try/catch 之外存在。但是上面的代码,我认为它给了你文件的名称,但我想要有实际的文件。例如,我有一个包含 21 个文件的目录,我将它们放在数组文件中,这些文件的三个文件名作为数组 File_name 中的字符串。我想要做的是从 files 数组中的这些文件中只有这三个文件名在 File_name 数组中作为实际文件。抱歉我的信息令人困惑
    • 好的,我已经更新了示例以使用 ArrayList 有帮助吗?
    • 我试过了,但它只打印一个空数组 [ ]。通读帖子,我注意到可能需要 FilenameFilter。但我不知道如何实现这样的事情。欢迎任何帮助。还是谢谢你!!!
    • 鉴于您发布的代码中的错误,可能是您的新代码损坏了。发布您修改后的代码。
    • 我已经编辑了我的第一篇文章并在那里发布了我修改后的代码
    猜你喜欢
    • 2014-12-07
    • 2017-08-30
    • 2017-06-10
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-22
    • 2018-11-12
    相关资源
    最近更新 更多