两个文件之间的差异

Diff between two files

我正在寻找执行以下操作的代码片段:

给定两个代表两个文件的字符串列表

例如,

如果我调用 diff(file1,file2)

输出将是 FILE1 和 FILE2 之间的差异:

  1. *SSome|另一个
  2. -简单
  3. TText
  4. F文件
  5. +WWith
  6. +A附加
  7. +L线

非常感谢!

这是我试过的。

import java.util.*;

public class SetDemo
{
    public static void main(String[] args){
        String[] file1 = new String[]{"Some", "Simple", "Text", "File"};
        String[] file2  = new String[]{"Another", "Text", "File", "With", "Additional", "Lines"};
        Set<String> set1 = new HashSet<String>();
        Set<String> set2 = new HashSet<String>();

        for(String s: file1)
            {
                set1.add(s);
            }

        for(String s2: file2)
            {
                set2.add(s2);
            }

        Set<String> s1intercopy = new HashSet<String>(set1);
        Set<String> s2intercopy = new HashSet<String>(set2);

        s1intercopy.retainAll(s2intercopy); //Finds the intesection                                                                                                                                                                                                                  

        Set<String> s1symdiffcopy = new HashSet<String>(set1);
        Set<String> s2symdiffcopy = new HashSet<String>(set2);

        s1symdiffcopy.removeAll(set2);
        s2symdiffcopy.removeAll(set1);

        int count = 0;
        for(String s7: s1intercopy){
            count++;
            System.out.println(Integer.toString(count)+'.'+s7);
        }
        if (set1.size() > set2.size())
        {
            for(String s3: s1symdiffcopy){
                count++;
                System.out.println(Integer.toString(count)+'.'+'+'+s3);
            }
            for(String s4: s2symdiffcopy){
                count++;
                System.out.println(Integer.toString(count)+'.'+'-'+s4);
            }
        }else if (set2.size() > set1.size())
        {
            for(String s5: s2symdiffcopy){
                count++;
                System.out.println(Integer.toString(count)+'.'+'+'+s5);
            }
            for(String s6: s1symdiffcopy){
                count++;
                System.out.println(Integer.toString(count)+'.'+'-'+s6);
            }
        }

    }
}

输出:

1.Text
2.File
3.+Lines
4.+Additional
5.+Another
6.+With
7.-Some
8.-Simple

我不确定你所说的 *Some|Another 是什么意思,但上面的代码所做的只是找到集合之间的交集和对称差异,确定哪个集合更大,然后分配 '+'属于较大集合的值,“-”属于较小集合的值。为了节省时间,我没有从文件中读入,但这部分很简单,你可以查一下。根据您的输出,您似乎正在搜索一个文件,并且该文件中的每个字符串都在搜索另一个文件。这对于大文件来说效率很低,所以我相信上述解决方案通过将其保存到集合中并执行集合操作来优化它。

我从你的问题中收集到以下信息:

  • *word1|word2 - 表示文件 1 中的单词在文件 2 中已更改
  • -word - 表示文件 1 中的单词已从文件 2
  • 中删除
  • word - 表示文件 1 中的单词在文件 2 中保持不变
  • +word - 表示该词最初不在文件 1 中,而是添加到文件 2

我认为文件 1 是 "source" 文件,文件 2 是 "destination" 文件,我们显示了它们的这些差异。话虽如此,试试这个算法(它并不完美 DiffNow 但它非常接近):

public static void main(String[] args) throws Exception {
    List<String> file1 = new ArrayList(Arrays.asList("Some", "Simple", "Text", "File"));
    List<String> file2 = new ArrayList(Arrays.asList("Another", "Text", "File", "With", "Additional", "Lines"));

    boolean diff = false;
    int file2Index = 0;
    for (int file1Index = 0; file1Index < file1.size();) {
        if (!file1.get(file1Index).equals(file2.get(file2Index)) && !diff) {
            diff = true;
            // The word from file 1 was changed
            System.out.println("*" + file1.get(file1Index) + "|" + file2.get(file2Index));
            file1Index++;
            file2Index++;
        } else if (!file1.get(file1Index).equals(file2.get(file2Index)) && diff) {
            // This word was removed from file 1
            System.out.println("-" + file1.get(file1Index));
            file1Index++;
        } else {
            System.out.println(file1.get(file1Index));
            diff = false;
            file1Index++;
            file2Index++;
        }
    }

    // Print what's left from file 2
    for (; file2Index < file2.size(); file2Index++) {
        System.out.println("+" + file2.get(file2Index));
    }
}

结果:

*Some|Another
-Simple
Text
File
+With
+Additional
+Lines