基础版本(控制台指定路径文件统计)
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.*;
/**
* @Author: dh
* @Description :
* @Date: Created in 2023/6/7 15:21
* @Modified By:
**/
public class cp {
public static void main(String[] args) {
// 要统计词频的文件路径
String filePath = "D:\\a仓库\\a.txt";
// 从命令行输入需要输出的前 n 个最高频率词语
Scanner sc = new Scanner(System.in);
System.out.print("请输入需要输出的前 n 个最高频率词语 n = ");
int topN = sc.nextInt();
Map<String, Integer> wordFreqMap = new HashMap<>();
try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
String line;
while ((line = br.readLine()) != null) {
// 利用正则表达式将一行文本拆分为若干词语
String[] words = line.trim().split("[^\\u4e00-\\u9fa5]+");
for (String word : words) {
// 统计每个词语的出现频率
if (wordFreqMap.containsKey(word)) {
wordFreqMap.put(word, wordFreqMap.get(word) + 1);
} else {
wordFreqMap.put(word, 1);
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
// 将所有词语按照出现频率排序
List<Map.Entry<String, Integer>> wordFreqList = new ArrayList<>(wordFreqMap.entrySet());
Collections.sort(wordFreqList, new Comparator<Map.Entry<String, Integer>>() {
@Override
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
return o2.getValue() - o1.getValue();
}
});
// 输出出现频率最高的前 n 个词语
System.out.printf("出现频率最高的前 %d 个词语为:\n", topN);
for (int i = 0; i < topN && i < wordFreqList.size(); i++) {
System.out.printf("%d. %s(%d 次)\n", i + 1, wordFreqList.get(i).getKey(), wordFreqList.get(i).getValue());
}
}
}
GUI 版本
源码如下:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.util.*;
import java.util.List;
import java.util.regex.*;
public class WordFrequencyCounter extends JFrame {
// 用于显示当前选择的文件路径
private JLabel filePathLabel = new JLabel("请选择要统计词频的文件:");
// 用于选择要统计词频的文件
private JButton chooseFileButton = new JButton("选择文件");
// 用于输入需要输出的前 n 个最高频率词语
private JTextField topNField = new JTextField("10", 5);
// 用于计算词频
private JButton calculateButton = new JButton("开始计算");
// 用于显示计算结果
private JTextArea resultArea = new JTextArea();
// 当前选择的文件路径
private String filePath;
public WordFrequencyCounter() {
// 设置界面标题
super("词频统计器");
// 将按钮和标签添加到窗口中
JPanel panel = new JPanel();
panel.add(filePathLabel);
panel.add(chooseFileButton);
panel.add(new JLabel("输出前"));
panel.add(topNField);
panel.add(new JLabel("个最高频率词语"));
panel.add(calculateButton);
add(panel, BorderLayout.NORTH);
// 将文本域添加到窗口中
resultArea.setEditable(false);
JScrollPane scrollPane = new JScrollPane(resultArea);
add(scrollPane, BorderLayout.CENTER);
// 设置窗口大小和关闭方式
setSize(800, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
// 注册选择文件按钮的事件处理器
chooseFileButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser fileChooser = new JFileChooser();
int result = fileChooser.showOpenDialog(WordFrequencyCounter.this);
if (result == JFileChooser.APPROVE_OPTION) {
File file = fileChooser.getSelectedFile();
filePath = file.getAbsolutePath();
filePathLabel.setText("当前选择的文件为:" + filePath);
}
}
});
// 注册开始计算按钮的事件处理器
calculateButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 从文本框中获取需要的前 n 个最高频率词语
int topN = Integer.parseInt(topNField.getText());
if (filePath == null) {
JOptionPane.showMessageDialog(WordFrequencyCounter.this, "请选择要统计词频的文件!");
return;
}
// 在单独的线程中计算词频,并将结果显示到文本域中
Thread thread = new Thread() {
@Override
public void run() {
String result = calculateWordFrequency(filePath, topN);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
resultArea.setText(result);
}
});
}
};
thread.start();
}
});
}
/**
* 计算词频,并返回结果字符串
* @param filePath 要统计词频的文件路径
* @param topN 需要输出的前 n 个最高频词语
* @return 词频统计结果字符串
*/
private String calculateWordFrequency(String filePath, int topN) {
Map<String, Integer> wordFreqMap = new HashMap<>();
try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
String line;
while ((line = br.readLine()) != null) {
// 利用正则表达式将一行文本拆分为若干词语
String[] words = line.trim().split("[^\\u4e00-\\u9fa5]+");
for (String word : words) {
// 统计每个词语的出现频率
if (wordFreqMap.containsKey(word)) {
wordFreqMap.put(word, wordFreqMap.get(word) + 1);
} else {
wordFreqMap.put(word, 1);
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
// 将所有词语按照出现频率排序
List<Map.Entry<String, Integer>> wordFreqList = new ArrayList<>(wordFreqMap.entrySet());
Collections.sort(wordFreqList, new Comparator<Map.Entry<String, Integer>>() {
@Override
public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
return o2.getValue() - o1.getValue();
}
});
// 构造结果字符串
StringBuilder sb = new StringBuilder();
sb.append("出现频率最高的前 ").append(topN).append(" 个词为:\n\n");
for (int i = 0; i < topN && i < wordFreqList.size(); i++) {
sb.append(i + 1).append(". ")
.append(wordFreqList.get(i).getKey())
.append("(").append(wordFreqList.get(i).getValue()).append(" 次)\n");
}
return sb.toString();
}
public static void main(String[] args) {
WordFrequencyCounter frame = new WordFrequencyCounter();
frame.setVisible(true);
}
}