如何写入新的文本文件并保留白色间距?

How to write to a new text file and preserve white spacing?

提问人:h0neybugz 提问时间:3/28/2023 更新时间:3/28/2023 访问量:51

问:

我正在尝试“拼写检查”给定的文本文件,我的程序会读取给定的文件并引用我的老师给出的字典哈希集。如果它找到字典中没有的单词或被某些字符拆分的单词,它会用<>将该单词括起来。一个条件是我需要保留单词之间的空格,我不知道如何确保程序这样做。

当前代码:

public static void spellCheck(File processingFile, File dictionaryFile) {
        try {
            HashSet<String> dictionary = new HashSet<>();
            FileReader processing = new FileReader(processingFile);
            FileReader dictionaryF = new FileReader(dictionaryFile);
            PrintWriter outputFile = new PrintWriter("test_spellChecked.txt");
            
            Scanner scnr = new Scanner(dictionaryF);
            String word = scnr.nextLine();
            while(scnr.hasNext()) {
                //dont need to check for double words cus its literally a dictionary
                dictionary.add(word);
                word = scnr.nextLine();
                
            }
            //somehow create a stored text file of the processing text that gets changed based on the dictionary check
            
            scnr = new Scanner(processing);
            word = scnr.next();
            boolean isCorrect = true;
            while(scnr.hasNext()) {
                if(word.matches("[a-zA-Z]+")) {
                    if(!dictionary.contains(word.toLowerCase())) {
                        outputFile.print("<" + word + ">");
                    }
                    else
                        outputFile.print(word);
                }
                else {
                    String[] words = word.split("((?=[^a-zA-Z])|(?<=[^a-zA-Z]))");
                    for(String splitWord: words) {
                        if(!dictionary.contains(splitWord.toLowerCase())) {
                            outputFile.print("<" + splitWord + ">");
                        }
                        else
                            outputFile.print(splitWord);
                    }
                }
                word = scnr.next();
            }
            
            outputFile.close();
            System.out.println("File has been checked.");
        }
        catch (FileNotFoundException e) {
            System.out.println("File not found!");
        }
        

    }

我刚刚弄清楚了如何用相同的单词将文件重写到文件中,我不确定如何保留空格。

java 文件 java.util.scanner

评论

0赞 Hovercraft Full Of Eels 3/28/2023
要保留空格,首先不要删除它。它不会从字符串中删除,除非您(编码人员)显式删除它。

答:

0赞 Giuk Kim 3/28/2023 #1
            while(scnr.hasNext()) {
                if(word.matches("[a-zA-Z]+")) {
                    if(!dictionary.contains(word.toLowerCase())) {
                        outputFile.print("<" + word + ">");
                    }
                    else
                        outputFile.print(word);
                }
                else {
                    String[] words = word.split("((?=[^a-zA-Z])|(?<=[^a-zA-Z]))");
                    for(String splitWord: words) {
                        if(!dictionary.contains(splitWord.toLowerCase())) {
                            outputFile.print("<" + splitWord + ">");
                        }
                        else
                            outputFile.print(splitWord);
                    }
                }
                word = scnr.next();
            }

这就是删除空间的原因。

word 和 splitWord 不包含空格。

因为你正在阅读scnr.next()

next()读取文件,直到空格或行更改。

像这样改变,或者outputFile.print(splitWord+" ");outputFile.format("%s ", splitWord);

将节省空间。

但这不会保存或\n\t

如果你也想保存,\n

      for(String word:words){
        if(word.matches("[a-zA-Z]+")) {
          if(!dictionary.contains(word.toLowerCase())) {
            outputFile.print("<" + word + ">");
          }
          else
            outputFile.print(word);
        }
        else {
          String[] words = word.split("((?=[^a-zA-Z])|(?<=[^a-zA-Z]))");
          for(String splitWord: words) {
            if(!dictionary.contains(splitWord.toLowerCase())) {
              outputFile.print("<" + splitWord + ">");
            }
            else
              outputFile.print(splitWord);
          }
        }
        outputFile.println();
      }
      nextLine = scnr.nextLine();
      words = nextLine.split(" ");
    }
0赞 VGR 3/28/2023 #2

问题是这样的:

word = scnr.next();

这会导致扫描程序丢弃所有空格,直到下一个令牌。

要保留文件中的所有内容,不能使用零参数 hasNext() 和 next() 方法。

相反,请使用 hasNext(Pattern) 和 next(Pattern) 方法,以便能够保留每个字符:

Pattern wordPattern = Patter.compile("(\\W*)(\\w+)");

while (scnr.hasNext(wordPattern)) {
    scnr.next(wordPattern);

    String separator = scnr.match().group(1);
    String word = scnr.match().group(2);

    outputFile.print(separator);
    if (!dictionary.contains(word.toLowerCase())) {
        outputFile.print("<" + word + ">");
    } else {
        outputFile.print(word);
    }
}