【问题标题】:Printing Out File Names that are Different打印出不同的文件名
【发布时间】:2017-07-05 17:34:43
【问题描述】:

我下面的代码有效并且逻辑有效。但是,我想打印出两个文件夹中不同的实际文件的名称,它们保存在fileNames1fileNames2 的数组中。我一直在寻找没有解决方案的答案。在离开 Java 一段时间后,我才刚刚回到 Java 的最佳状态。任何帮助,将不胜感激。

import java.io.File;
import java.util.ArrayList;

public class nameCompare {

    public static void main(String[] args) {

        String path1 = "C:/Users/hoflerj/Desktop/test"; 
        String path2 = "C:/Users/hoflerj/Desktop/test2"; 

        File folder1 = new File(path1);
        File folder2 = new File(path2);

        File[] listOfFiles1 = folder1.listFiles(); 
        File[] listOfFiles2 = folder2.listFiles(); 

        ArrayList<String> fileNames1 = new ArrayList<String>();
        ArrayList<String> fileNames2 = new ArrayList<String>();

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

            if (listOfFiles1[i].isFile()) 
            {
                fileNames1.add(listOfFiles1[i].getName());//wow
            }
        }

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

            if (listOfFiles2[i].isFile()) 
            {
                fileNames2.add(listOfFiles2[i].getName());//seriously wow
            }
        }


        for ( int i = 0; i < 1; i++ )
        {
            if (fileNames1.equals(fileNames2) )
            { 
                System.out.println("Files names are the same");
            }

            else if (fileNames1 != fileNames2 )
            { 
                System.out.println("Files names are not equal");
            }
        }

    }

}

【问题讨论】:

  • 您在输出中究竟要寻找什么?
  • fileNames1 != fileNames2 不是如何比较字符串。在您进行的第一个测试前面放一个!,例如!fileNames1.equals(fileNames2) 进行与该测试相反的测试。

标签: java arrays


【解决方案1】:

最简单优雅的方法是:

    List<String> commonFiles= new ArrayList<String>(fileNames1);
    commonFiles.retainAll(fileNames2);       

    Set<String> uniqueFiles = new HashSet<String>(fileNames1);
    uniqueFiles.addAll(fileNames2);
    uniqueFiles.removeAll(commonFiles);

【讨论】:

    【解决方案2】:

    创建并填充两个列表后,使用以下代码:-

    for(String fileName : fileNames1)
    {
     if(!fileNames2.contains(fileName))
       {
         System.out.println(fileName + " is not in both");
       } 
     else
       {
         System.out.println(fileName + " is in both the lists");
       }
    }
    

    这段代码的作用是,对于第一个ArrayList 中的每个fileName,它会检查第二个ArrayList 是否包含相同的文件名,并相应地打印输出。

    【讨论】:

    • eclipse 建议这个 for(String fileName : fileNames1)。对吗?
    • 这将遗漏列表 2 中不在列表 1 中的项目。因此,如果 fileNames2 包含所有 fileNames1 加上一些,它只会说“两个列表中的文件”
    • 那么我如何在eclipse中克服这个错误? fileNames1 下有一条红线
    • @JonathanHofler 确实 Eclipse 是正确的,我的回答有误。我已经将它编辑成现在应该的样子,我为我的错误道歉!
    • 另外,我同意 Tezra 的说法。我的解决方案必须实施两次。更优雅的解决方案将涉及使用哈希结构来优化效率。但是,由于我读到您刚刚回到 java 状态,并且认为您的数据结构相对较小,因此我不建议使用 Hash 实现。但是,如果您确实使用 Hash 实现了解决方案,那么当您处理“包含”类型的情况时,这始终是最好的解决方案。
    【解决方案3】:

    只需比较两个数组的每个元素。

    for( int i = 0; i <= listOfFiles1.length - 1; i++)
    {
        for( int j = 0; i <= listOfFiles2.length - 1; i++)
    {
        if (listOfFiles1[i].equals(listOfFiles2[j]) )
            { 
                System.out.println("Files names are the same");
            }
    
            else if (listOfFiles1[i]!= listOfFiles2[j])
            { 
                System.out.println("Files names are not equal");
            }
    
    }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2016-02-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 2011-12-19
      • 1970-01-01
      • 2013-03-23
      • 1970-01-01
      相关资源
      最近更新 更多