java

koaltpgm  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(264)

我有一个文件(file1.txt)包含:

word word word2 word word1
word2 word word 1

另一个文件(file2.txt)包含:

word1-replacement1
word2-replacement2

我需要一个方法来查找文件2中的单词是否包含在文件1中,如果包含这些单词,请用替换词替换这些单词。
我已经有以下内容:

BufferedReader br = new BufferedReader(new FileReader("file2.txt"));
    BufferedReader br2 = new BufferedReader(new FileReader("file1.txt"));
    String line;
    String line2;

    while ((line = br.readLine()) != null) {
        String vars[] = line.split("-");
        String varname = vars[0];
        String replacement = vars[1];

        while ((line2 = br2.readLine()) != null) {
            if(line2.contains(varname)) {
                line2.replace(varname, replacement);
            }
        }
    }

这段代码的问题是,它只读取file1的第一行。
最终输出应如下所示:

word word replacement2 word replacement1
replacement2 word replacement1

感谢您的帮助:)

wnvonmuf

wnvonmuf1#

您可以从创建替换Map开始,如下所示:

public Map<String,String> getReplacements(File file) throws FileNotFoundException {
    Map<String, String> replacementMap = new HashMap<>();
    Scanner sc = new Scanner(file);
    while(sc.hasNextLine()) {
        String line = sc.nextLine();
        String [] replacement = line.split("-");
        String from = replacement[0];
        String to = replacement[1];
        replacementMap.put(from,to);
    }
    return replacementMap;
}

然后使用Map替换另一个文件中的单词。

s1ag04yj

s1ag04yj2#

我建议首先将第二个文件读入java内存,并将数据作为键值存储在hashmap中。然后,遍历第一个文件中的行,并进行任何匹配的替换。

Map<String, String> map = new HashMap<>();
String line = "";

try (BufferedReader br = new BufferedReader(new FileReader("file2.txt"))) {
    while ((line = br.readLine()) != null) {
        String[] parts = line.split("-");
        map.put(parts[0], parts[1]);
    }
}
catch (IOException e) {
    // handle exception
}

try (BufferedReader br = new BufferedReader(new FileReader("file1.txt"))) {
    while ((line = br.readLine()) != null) {
        for (Map.Entry< String, String > entry : map.entrySet()) {
            String pattern = "\\b" + entry.getKey() + "\\b";
            line = line.replaceAll(pattern, entry.getValue());

            // now record the updated line; printed to the console here for demo purposes
            System.out.println(line);
        }
    }
}
catch (IOException e) {
    // handle exception
}

请注意,我打电话给 String#replaceAll 每个词周围都有单词边界。这很重要,因为,例如,没有边界 word1 会匹配像这样的东西 aword1term ,也就是说,它将匹配 word1 甚至作为其他单词的子串。

相关问题