【问题标题】:How do i convert a textfile to lower case and find the frequencies of the letters?如何将文本文件转换为小写并找到字母的频率?
【发布时间】:2020-05-28 19:16:01
【问题描述】:

我正在编写一个读取文本文件并输出字母频率的代码。我使用FileInputStream 方法读取文件,但我不知道如何将大写转换为小写。

代码运行但只读取小写字母。我该如何解决这个问题?

【问题讨论】:

  • String.toUpperCase(),但你应该使用FileReader,而不是``FileInputStream`。

标签: java fileinputstream


【解决方案1】:

此解决方案不会将大写转换为小写,但可以帮助您解决问题。

由于 char 值来自 ASCII 表,您可以像这样进行第二次循环:

char ch = 'A';

for(int i=0; i<26; i++){
    if(d==ch) {
        f[i] += 1;
    }
    ch++;
}

或者你可以在你的 for 循环中修改你的条件:

if(d==ch || d==(ch-32))

您可以在此处查看 ascii 表:https://www.cs.cmu.edu/~pattis/15-1XX/common/handouts/ascii.html

【讨论】:

    【解决方案2】:

    如果允许您使用 Java 8 流和诸如文件和路径之类的“新”IO 对象,您可以非常简单地完成此任务:

    Map<Character, Long> freq = Files.lines(Path.of(filepath))        // get stream of file lines
                    .flatMap(s -> s.chars().mapToObj(c -> (char) c))  // convert each line into stream of characters
                    .collect(
                        Collectors.groupingBy(Function.identity(),    // group by each character
                        Collectors.counting()));                      // count characters in the stream
    

    如果你只需要计算字母,你可以额外过滤它们:

    Map<Character, Long> letterFreq = Files.lines(Path.of(filepath))
                    .flatMap(s -> s.chars().mapToObj(c -> (char) c))
                    .filter(Character::isLetter)
                    .collect(
                        Collectors.groupingBy(Function.identity(), Collectors.counting()));
    

    【讨论】:

      【解决方案3】:

      您的程序运行良好。要转换为小写,请参阅以下内容:

      while ((d = fileInputStream.read()) != -1) {
          d = Character.toLowerCase(d); // <-- add this line here
          char ch = 'a';
          for (int i = 0; i < 26; i++) {
      
             if (d == ch) {               
                 f[i] = f[i] + 1;
             }
             ch++;
          }
      }
      

      其他一些建议。

      • try 块的末尾放置一个 catch 块。
      } catch (IOException e) {
          e.printStackTrace();
      }
      
      • 当您打印出字符时,请忽略那些计数为零的字符,以使您的频率计数更具可读性。

      • 原始数字数组被初始化为 0,因此您不需要这样做。

      【讨论】:

        猜你喜欢
        • 2013-02-04
        • 1970-01-01
        • 2015-08-07
        • 1970-01-01
        • 1970-01-01
        • 2013-11-02
        • 2015-07-28
        • 1970-01-01
        • 2013-07-26
        相关资源
        最近更新 更多