java 读取txt文件,查找部分单词,用其他单词的Hashmap替换,保留大小写

zvms9eto  于 2023-01-15  发布在  Java
关注(0)|答案(1)|浏览(174)

我有一个过度使用的单词的散列表作为键,它们的替换作为值。这是来自Map的一些值。
[惊人的:惊人的有趣的:字面上耐人寻味的:坦率地说好的:愉快的困难:费力的变化:转变......]
我必须实现一个类,它可以在给定的文本文件中搜索过度使用的单词,并用更好的选择替换它们。旧文本文件
““太棒了”是我能想到的最好的形容词。从字面上看,很难表达我有多喜欢它。它太棒了!!!!好,不错。我不会改变它的一点。请你友好一点,帮我修改一下我的写作!!b BB BB BB BB B。”

新文本文件

““令人震惊”是我能想到的最好的形容方式。坦白说,表达我有多喜欢它是一件费力的事。它令人惊讶地令人愉快!!!!上级,而不是低劣。我不会改变它的一点。请你愉快,帮助我修改我的写作!!猫BB BB BB BB猫“

  • TextImprover必须保留输入文件的标点符号。
  • 假设输入文件中的所有单词都是小写、前导大写或全大写。

我已经实现了第一个函数,它读取一个txt文件并绘制一个过度使用的单词的Map:

public class TextImprover {

    private HashMap<String, String> wordMap ;

    /**
     * Constructor
     * 
     * @param wordMapFileName   name of the file containing the over-used words and their replacements
     */
    public TextImprover(String wordMapFileName) { 
        this.wordMap = new HashMap<String,String>();
        try {
        BufferedReader br = new BufferedReader(new FileReader(wordMapFileName));
        String line ;
        while((line = br.readLine())!= null) {
            String[] wordLine = line.split("\t");
            //System.out.println(wordLine[1]);
            String overUsedWord = wordLine[0].trim();
            String replaceWord = wordLine[1].trim();
            
            wordMap.put(overUsedWord, replaceWord);
        }
        br.close();
            
        }catch(FileNotFoundException e){
            System.out.println("File: "+ wordMapFileName + " not found");   
        }catch (IOException e1) {
            System.out.println(e1.getMessage());
        }
    }

我需要此函数:

/**
     * Replaces all of the over-used words in the given file with better words, based on the word map
     * used to create this TextImprover
     * 
     * @param fileName  name of the file containing the text to be improved
     */
    public void improveText(String fileName) {
        try {
            BufferedReader br = new BufferedReader(new FileReader(fileName));
            String line ;
            while((line = br.readLine())!= null) {
                String[] lineWords = line.split(" ");
                // The code I'm strugling with 
            }
            br.close();
                
            }catch(FileNotFoundException e){
                System.out.println("File: "+ fileName + " not found");  
            }catch (IOException e1) {
                System.out.println(e1.getMessage());
            }

    }

谢谢你的帮助。

mkshixfv

mkshixfv1#

split方法也使用正则表达式进行拆分,而我将以“通常”的方式使用正则表达式([a-zA-Z]+)来查找输入中的下一个单词(“通常”的方式是使用PatternMatcher)。
然后使用Matcher.replaceAll(Function<MatchResult,String> replacer)方法,将每个匹配项放入函数中,然后从Map中获取替换项,并决定是否要将其转换为全部大写或标题大写(仅第一个字符大写)。
您发布的代码的等效代码(因此没有实际的内部替换内容,但在那里更容易)将如下所示:

Pattern pattern = Pattern.compile("[a-zA-Z]+"); // best outside the while loop!

// From here replaces your String[] lineWords = line.split(" "); inside the loop
Matcher matcher = pattern.matcher(line);
String result = matcher.replaceAll(match -> {

    String word = match.group();
    // TODO: find out if word is "ALL CAPS" or "Title Case"
    // TODO: get replacement from map - don't forget to convert the input to the map toLowerCase()
    String replacement = ...;
    return replacement
});

// here your result contains the whole line with all replacements.

相关问题