在两个文件中查找相似的单词(字符串)

ssa*_*aee 5 java java.util.scanner

我必须验证文件1中的单词1与文件2中的单词2的相似性,依此类推.如果单词1(文件1).equals到单词2(文件2),则文件3将是输出以显示True和False.下面是编码,但是当没有错误但没有输出时我被卡住了.我是JAVA的初学者.

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;

public class test2 {

    private static ArrayList<String> load(String f1) throws FileNotFoundException {
        Scanner reader = new Scanner(new File(f1));
        ArrayList<String> out = new ArrayList<String>();
        while (reader.hasNext()) {
            String temp = reader.nextLine();
            String[] sts = temp.split(" ");
            for (int i = 0; i < sts.length; i++) {
                if (sts[i].equals("") && sts[i].equals(" ") && sts[i].equals("\n")) {
                    out.add(sts[i]);
                }
            }
        }
        return out;
    }

    private static void write(ArrayList<String> out, String fname) throws IOException {
        FileWriter writer = new FileWriter(new File("out_test2.txt"));
        for (int i = 0; i < out.size(); i++) {
            writer.write(out.get(i) + "\n");
        }
        writer.close();
    }

    public static void main(String[] args) throws IOException {
        ArrayList<String> file1;
        ArrayList<String> file2;
        ArrayList<String> out = new ArrayList<String>();
        file1 = load("IbanDict.txt");
        file2 = load("AFF_outVal.txt");

        for (int i = 0; i < file1.size(); i++) {
            String word1 = file1.get(i);
            for (int z = 0; z < file2.size(); z++) {
                if (word1.equalsIgnoreCase(file2.get(z))) {
                    boolean already = false;
                    for (int q = 0; q < out.size(); q++) {
                        if (out.get(q).equalsIgnoreCase(file1.get(i))) {
                            already = true;
                        }
                    }
                    if (already == false) {
                        out.add(file1.get(i));
                    }
                }
            }
        }
        write(out, "out_test2.txt");
    }

}
Run Code Online (Sandbox Code Playgroud)

wul*_*pro 2

首先,Scanner将为您标记您的字符串。String.split使用该方法无需读取一行并进行标记;参考这里

其次,你这里似乎有一个逻辑错误:

for (int i = 0; i < sts.length; i++) {
    if (sts[i].equals("") && sts[i].equals(" ")
            && sts[i].equals("\n"))
       out.add(sts[i]);
}
Run Code Online (Sandbox Code Playgroud)

(假设我明白你想要做什么)它应该是:

for (int i = 0; i < sts.length; i++) {
    if (!(sts[i].equals("") && sts[i].equals(" ") && sts[i]
           .equals("\n")))
       out.add(sts[i]);
}
Run Code Online (Sandbox Code Playgroud)

这就是为什么您看不到任何输出的原因。

注意:这种匹配方式容易出错并且远非最优(线性);使用 awk 或 Python 等专门的文本解析语言可能会取得更大的成功(假设您不受 Java 的束缚)。如果您坚持使用 Java,另一种实现可能是扩展FilterReader/Writer类,如下所示