有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JAVAutil。Java扫描程序从文件中计算字、行和字符

我正试着从文件中读入单词。我需要计算文本文件中的单词、行和字符。字数应仅包括单词(仅包含字母、标点、空格或非字母字符)。字符计数应仅包括这些单词中的字符

这就是我目前所拥有的。我不知道怎么数这些字符。每次我运行程序时,只要我输入文件名,它就会跳转到catch机制(而且它应该与文件路径没有问题,因为我以前尝试过使用它)。我试图在没有try/catch的情况下创建程序,以查看错误是什么,但是没有try/catch就无法工作

为什么输入文件名时会跳转到catch函数?如何修复此程序以正确计算文本文件中的字、行和字符


共 (3) 个答案

  1. # 1 楼答案

    我尝试了你的代码,但没有收到任何异常。然而,我怀疑当你输入文件名时,你可能忘记了文件的扩展名

  2. # 2 楼答案

    如果我给出正确的文件名,你的代码不会有任何异常。至于读取字符数,你应该稍微修改一下逻辑。与其直接连接字数计数,不如创建一个StringTokenizer st = new StringTokenizer(tempo, "[ .,:;()?!]+");的新实例,遍历所有标记,并对每个标记的长度求和。这应该会给出字符数。比如下面

    while (fileScan.hasNextLine()) {
                lineC++;
                tempo = fileScan.nextLine();
                StringTokenizer st = new StringTokenizer(tempo, "[ .,:;()?!]+");
                wordC += st.countTokens();
                while(st.hasMoreTokens()) {
                    String stt = st.nextToken();
                    System.out.println(stt); // Displaying string to confirm that like is splitted as I expect it to be
                    charC += stt.length();
                }
                System.out.println("Lines: " + lineC + "\nWords: " + wordC+" \nChars: "+charC);
            }
    

    注意:StringTokenizer转义字符将不起作用。i、 e.您可能希望\\s应该使用任何空格字符进行分隔,但它将基于文字字符s进行分隔。如果你想转义一个字符,我建议你使用java.util.Patternjava.util.Matcher并使用它matcher.find()来识别单词和字符

  3. # 3 楼答案

    您可能在输入时忘记了文件扩展名,但有一种更简单的方法。你还提到你不知道如何计算角色。你可以试试这样:

    import java.util.Scanner;
    import java.util.StringTokenizer;
    import java.io.*;
    import java.util.stream.*;
    
    public class WordCount
    {
        public static void main(String[] args)
        {
            Scanner userInput = new Scanner(System.in);
    
           try {
                // Input file
                System.out.println("Please enter the name of the file.");
                String content = Files.readString(Path.of("C:/Users/garre/OneDrive/Desktop/" + userInput.next()));
                System.out.printf("Lines: %d\nWords: %d\nCharacters: %d",content.split("\n").length,Stream.of(content.split("[^A-Za-z]")).filter(x -> !x.isEmpty()).count(),content.length());
                }
    
    
            catch (IOException ex1) {
                System.out.println("Error.");
                System.exit(0);
            }
        }
    }
    

    检查代码

    import java.util.stream.*;
    

    注意:我们使用streams包,在查找单词时过滤掉空字符串。现在让我们向前跳一点

    String content = Files.readString(Path.of("C:/Users/garre/OneDrive/Desktop/" + userInput.next()));
    

    上面的部分获取文件中的所有文本,并将其存储为字符串

    System.out.printf("Lines: %d\nWords: %d\nCharacters: %d",content.split("\n").length,Stream.of(content.split("[^A-Za-z]")).filter(x -> !x.isEmpty()).count(),content.length());
    

    好的,这是一条长长的队伍。让我们把它分解一下

    "Lines: %d\nWords: %d\nCharacters: %d"是一个格式字符串,其中每个%d都被printf函数中相应的参数替换。第一个%d将被content.split("\n").length替换,这是行数。我们通过拆分字符串得到行数

    第二个%dStream.of(content.split("[^A-Za-z]")).filter(x -> !x.isEmpty()).count()替换Stream.of从一个数组中创建一个流,在拆分任何非字母的内容(你说的单词是任何非字母的内容)之后,该数组就是一个字符串数组。接下来,我们过滤掉所有空值,因为String.split保留空值。.count()是不言自明的,取过滤后剩余的单词量

    第三个也是最后一个%d是最简单的。它被字符串的长度所取代content.length()应该是不言自明的

    我保留了你的catch块,但我觉得System.exit(0)有点多余