Java 比较两个Unicode文件并在第三个文件中写入输出

Java 比较两个Unicode文件并在第三个文件中写入输出,java,string,ubuntu,file-handling,Java,String,Ubuntu,File Handling,我有两个文件。两个文件的行数相等(每个1000行)。我必须比较这些文件,并在第三个文件中写入差异。每个并发的行可能有不同的字数 我在Ubuntu中尝试了diff命令。但它既不能与乌尔都语很好地结合,也不能给出所需的结果 我已经尝试并更新了java代码的公认答案 我不是在这里张贴代码,问题将变得冗长 示例输入文件一: 因此,说绅士是一个从不制造痛苦的人,这几乎就是绅士的定义 这一描述既精炼又准确,他主要专注于 示例输入文件二: 因此,这是对绅士最恰当的定义——他是一个从不传染痛苦的人 这个描述既精

我有两个文件。两个文件的行数相等(每个1000行)。我必须比较这些文件,并在第三个文件中写入差异。每个并发的行可能有不同的字数

我在Ubuntu中尝试了
diff
命令。但它既不能与乌尔都语很好地结合,也不能给出所需的结果

我已经尝试并更新了java代码的公认答案

我不是在这里张贴代码,问题将变得冗长

示例输入文件一:

因此,说绅士是一个从不制造痛苦的人,这几乎就是绅士的定义

这一描述既精炼又准确,他主要专注于

示例输入文件二:

因此,这是对绅士最恰当的定义——他是一个从不传染痛苦的人

这个描述既精炼又准确,他主要从事于

所需输出:

几乎=>大多数

说=>lay

造成=>感染

精炼=>精炼

as=>

占据

任何脚本/代码/软件或命令,可以为我做的把戏将不胜感激。我懂Java,也有
Ubuntu16.10
Windows10

如果是java代码,那么我知道文件处理并编写了文件编写代码


注意:最初的文件是乌尔都语。所以是Unicode。我并没有发布乌尔都语,因为世界上大多数人都不理解它。我正在比较语音识别结果。文件一是输入文件,文件二是识别后的结果。

这里是我整理的一个快速算法

它寻找一系列不相似的单词来打印,并对相似的长度序列进行优先排序

List<String> output = new ArrayList<String>();
String lineA = "stuff and a few things";
String lineB = "stuff and maybe many things";

String[] a = lineA.split(" ");
String[] b = lineB.split(" ");
int counterA = 0;
int counterB = 0;

while(counterA < a.length && counterB < b.length)
{
    if(a[counterA].equals(b[counterB])) //check if next two elements are equal
    {
        counterA++;
        counterB++;
        continue;
    }

    //search from array a looking for matches in array b
    int aStart = -1;
    int aStop = -1;
    for(aStart = counterA; aStart < a.length && aStop == -1; aStart++)
        for(int i = counterB; i < b.length && aStop == -1; i++)
            if(a[aStart].equals(b[i]))
                aStop = i;
    if(aStop == -1) //no matches, select rest of both lists
    {
        aStart++; //need to inc start one extra time
        aStop = b.length;
    }

    //search from array b looking for matches in array a
    int bStart = -1;
    int bStop = -1;
    for(bStart = counterB; bStart < b.length && bStop == -1; bStart++)
        for(int i = counterA; i < a.length && bStop == -1; i++)
            if(b[bStart].equals(a[i]))
                bStop = i;
    if(bStop == -1) //no matches, select rest of both lists
    {
        bStart++; //need to inc one extra time
        bStop = a.length;
    }

    //find which one is more similar
    int aDist = Math.abs((--aStart - counterA) - (aStop - counterB)); //aStart and bStart are incremented 1 too many times
    int bDist = Math.abs((--bStart - counterB) - (bStop - counterA));

    if(aDist < bDist) //a's findings are a better match
    {
        String out = "";
        for(int i = counterA; i < aStart; i++)
            out += a[i] + " ";
        out += "=> ";
        for(int i = counterB; i < aStop; i++)
            out += b[i] + " ";
        out = out.substring(0, out.length() - 1); //remove last space
        output.add(out);
        counterA = aStart;
        counterB = aStop;
    }
    else //b's findings are a better match
    {
        String out = "";
        for(int i = counterA; i < bStop; i++)
            out += a[i] + " ";
        out += "=> ";
        for(int i = counterB; i < bStart; i++)
            out += b[i] + " ";
        out = out.substring(0, out.length() - 1); //remove last space
        output.add(out);
        counterA = bStop;
        counterB = bStart;
    }
}

System.out.println(output);
List output=new ArrayList();
String lineA=“stuff and something”;
String lineB=“stuff,可能还有很多东西”;
字符串[]a=lineA.split(“”);
字符串[]b=lineB.split(“”);
int计数器A=0;
int计数器b=0;
while(计数器a”;
for(int i=计数器b;i”;
for(int i=计数器b;i
在本例中,它打印“[some=>maybe many]”(列表中的[])


在文件的每一行上运行这个,它应该会给出一个相当好的差异

这是令人惊讶的复杂,如果每一行都是相同的长度,并且单词匹配,那么它将是微不足道的。由于缺少一些单词。。。不那么容易。如果有
a b c d
a e d
作为行,它会显示
b c=>d
,还是
b=>e,c=>
?这个网站就是这样工作的。虽然它不知道这个词是否不存在。逻辑可能类似于词库之后和之前。为什么有些行打印-1?行上有什么?如果乌尔都语中有不同的文本字符串,那么它的行中应该始终有一个“=>”。我想你不会明白的。它在某些方面做得很好。但对于某些行,它只是打印-1;线路上有a-1吗?代码的其他部分可以打印-1吗?仅仅是一个没有任何其他间隔或任何其他间隔或字符的人——一个仅仅是一个没有任何其他间隔的人——一个没有任何其他间隔或字符的人——一个仅仅是一个没有任何其他间隔的人——一个仅仅是一个没有任何其他间隔的人——一个没有任何其他间隔或字符的人——一个没有任何其他任何其他间隔的人——一个仅仅是一个没有任何其他任何其他任何其他间隔的人——一个是是是一个单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单单在15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15امللیگکا”;在本方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方方在15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 1746;گاسللیگق”;