【问题标题】:Frequency by letter order按字母顺序排列的频率
【发布时间】:2016-03-13 04:38:39
【问题描述】:

我希望按字母顺序通过频率来操作文本文件。在我的程序中有一种方法我不知道如何开始。我想得到类似的输出:

字母/计数

1 A 6 ***

2 B 8 ****

3 C 6 ***

(等等)

其中 6 个名称以 A 开头,8 个以 B 开头,6 个以 C 开头。 然后每 2 个计数一个 '*'。

我的练习问题实际上是使用一个包含 90000 个名称和不同的 '*' 计数的文本文件,但我非常感谢我的研究提供示例代码和解释其工作原理的说明。

这是我的程序的开始,但就像我说的那样,我不确定如何启动这个方法。

import javax.swing.JOptionPane;
import java.io.*;
public class P03Census {
String rec; 
int ctr = 0;


 public static void main(String[] args)throws IOException {
    Object result = JOptionPane.showInputDialog(null, "Enter a file           name\n(1990 to 2000)\nadd extension",
            "Taylor Daggett", JOptionPane.PLAIN_MESSAGE);

    String textDoc = (String) result;
    File file = new File(textDoc);
    System.out.println("-----------------------------------------------------------------------------------------");
    System.out.println("File name: " +
    file);

    if (!textDoc.endsWith(".txt")) {

        System.out.println("Usage: This is not a text file!");

        System.exit(0);

    } else if (!file.exists()) {

        System.out.println("File not found!");

        System.exit(0);


    }
    FileReader fr = new FileReader(file);
    BufferedReader br = new BufferedReader(fr);

    String rec;
    int lines = 0;
    int i;


    while((rec = br.readLine()) != null){

        lines++;
        }

        System.out.println("Record count:"+lines);  
        System.out.println("------------------------------------------------------------------------------------------");

}

}

【问题讨论】:

  • 欢迎来到 StackOverflow,发布您已经尝试过的内容,我们将看看如何为您提供帮助。
  • 我的程序有点不同,我不是在寻找适合我自己代码的东西。一个例子就足够了。
  • 你只关心名字的第一个字母,还是所有字母的个数?你的文件中的名称是什么分开的?
  • 只有第一个字母。
  • 我们可以假设您的文件只包含字符串而不包含其他数据类型吗?

标签: java sorting bufferedreader


【解决方案1】:

这是一个可以做你想做的事情的算法,它利用了你可以使用char 变量作为int 的事实:

  1. 首先,创建一个数组int[] letterCount = new int[26],您将使用它来计算字母。
  2. 然后,在 while 主循环的主体内,将字符串 rec 转换为数组 String[],其中每个元素都是一个名称。如果在您的输入文件中,名称总是由相同的char 分隔(例如空格),您可以使用String[] names = rec.split(" ")
  3. 接下来,在for 循环中运行names,并检查每个名称的第一个字母:char firstLetter = names[i].charAt(0)。并使用它在数组letterCountletterCount[firstLetter - 'a']++; 中将该字母的计数增加一

在循环结束时,letterCount 应该有正确的计数。 注意如果你的文件包含大写字母,你必须在循环体的开头调用rec.toLowerCase(),否则你会在尝试调用letterCount[firstLetter - 'a']时出现越界错误,或者如果所有名称都以大写开头,则只需替换为letterCount[firstLetter - 'A']

【讨论】:

    猜你喜欢
    • 2020-10-12
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多