1

大家好,我为从用户读取 .txt 文件的字符串数组编写了一个合并排序程序。但是我现在要做的是比较两个文件并打印出文件一中的单词而不是文件二中的单词,例如苹果在文件 1 中但不在文件 2 中。我尝试再次将其存储在字符串数组中,然后将其打印出来最后,但我似乎无法实现它。这是我所拥有的,

FileIO reader = new FileIO();
     String words[] = reader.load("C:\\list1.txt");
     String list[] = reader.load("C:\\list2.txt");

     mergeSort(words);
     mergeSort(list);
     String x = null ;

     for(int i = 0; i<words.length; i++)
     {
         for(int j = 0; j<list.length; j++)
         {
                 if(!words[i].equals(list[j]))
                 {
                      x = words[i];
                 }
         }
     }

     System.out.println(x);

任何帮助或建议将不胜感激!

4

5 回答 5

1

如果要检查第一个数组中但第二个数组中不存在的单词,可以这样做:

 boolean notEqual = true;           
 for(int i = 0; i<words.length; i++)
     {
         for(int j = 0; j<list.length && notEqual; j++)
         {
                 if(words[i].equals(list[j]))     // If the word of file one exist
                 {                                // file two we set notEqual to false
                      notEqual = false;           // and we terminate the inner cycle
                 }
         }
         if(notEqual)                      // If the notEqual remained  true
           System.out.println(words[i]);   // we print the the element of file one
                                           // that do not exist in the second file

         notEqual = true;                  // set variable to true to be used check
     }                                     // the other words of file one.

基本上,您从第一个文件(数组中的字符串)中取出一个单词并检查文件二中是否有一个相等的单词。如果找到它,则将控制变量设置notEqualfalse,从而退出内部循环 for 并且不打印该单词。否则,如果文件 2 中没有与文件 1 中的单词匹配的任何单词,则控制变量notEqual将为true. 因此,打印内部循环之外的元素。

如果您愿意,您可以将打印语句替换为另一个将唯一单词存储在额外数组中的语句。

另一个解决方案,虽然比第一个慢:

     List <String> file1Words = Arrays.asList(words);
     List <String> file2Words = Arrays.asList(list);

     for(String s : file1Words)
        if(!file2Words.contains(s))
          System.out.println(s);

您使用方法Arrays.asList将数组转换为 List ,并使用方法 contains 来验证第一个文件的单词是否在第二个文件中。

于 2012-12-12T14:51:04.347 回答
1

为什么不直接将数组转换为集合?然后你可以简单地做 result = wordsSet.removeAll(listSet);

您的结果将包含 list2.txt 中不存在的所有单词

另请记住,该集合将删除重复项;)

于 2012-12-12T15:27:30.127 回答
0

这看起来有点接近。您所做的是对 in 中的每个字符串words,将其与 in 中的每个单词进行比较list,因此,如果您甚至有一个list不在 in 中的字符串wordsx就会被设置。

我建议更改if(!words[i].equals(list[j]))if(words[i].equals(list[j])). 所以现在你知道 in 中的字符串words出现在 中list,所以你不需要显示它。如果你完全循环而list没有看到这个词,那么你知道你需要解释它。所以是这样的:

 for(int i = 0; i<words.length; i++)
 {
     boolean wordFoundInList = false;

     for(int j = 0; j<list.length; j++)
     {
             if(words[i].equals(list[j]))
             {
                  wordFoundInList = true;
                  break;
             }
     }

     if (!wordFoundInList) {
         System.out.println(x);
     }
 }
于 2012-12-12T14:52:19.050 回答
0

您也可以只遍历循环并在达到 list.length-1 时添加它。如果它匹配你可以打破整个东西

FileIO reader = new FileIO();
String words[] = reader.load("C:\\list1.txt");
String list[] = reader.load("C:\\list2.txt");

mergeSort(words);
mergeSort(list);
//never ever null
String x = "" ;

for(int i = 0; i<words.length; i++)
{
    for(int j = 0; j<list.length; j++)
    {
            if(words[i].equals(list[j]))
                 break;
            if(j == list.length-1)
                 x += words[i] + " ";
    }
}

System.out.println(x);
于 2012-12-12T14:56:22.623 回答
0

这是一个版本(虽然它不使用排序)

    String[] file1 = {"word1", "word2", "word3", "word4"};
    String[] file2 = {"word2", "word3"};
    List<String> l1 = new ArrayList(Arrays.asList(file1));
    List<String> l2 = Arrays.asList(file2);
    l1.removeAll(l2);
    System.out.println("Not in file2 " + l1);

它打印

Not in file2 [word1, word4]
于 2012-12-12T15:06:37.483 回答