题目
分析英文文章
功能:
某些英文单词是回文单词,现要求借助于栈的基本操作统计出某一篇英文文章中出现的所有回文单词及该文所有的单词的数量,并计算该文章的“回文单词比率”,其中回文单词比率的定义如下。
要求:
(1)英文文章用txt文件存储。
(2)使用栈的基本操作处理该英文文章。
(3)在屏幕上直接输出该文章中所有单词的总数量及回文单词的数量,并输出回文单词比率。
提示:
(1)英文文章中各单词是以空格作为分隔符的,在处理时编写代码将英文文章中英文单词以外的字符除去,包括标点符号。
(2)提取出英文单词后对其进行回文判断前,需将其所有字母均转换为小写的,原因是:如“Dad”其实是回文单词,但若不将其第一个字母“D”转换为小写字母“d”,则程序将会判断“Dad”不是回文单词。
成品展示
但是有个小bug,会出现两个文件选择框
相关代码
文件选择弹窗实现
package Struction;
import Struction.bobo;
import java.awt.EventQueue;
import javax.swing.JFrame;
import java.awt.Button;
import java.awt.BorderLayout;
import java.awt.event.ActionListener;
import java.io.File;
import java.lang.reflect.Method;
import java.nio.file.Path;
import java.awt.event.ActionEvent;
import java.awt.TextField;
import javax.swing.JTextField;
import javax.swing.filechooser.FileSystemView;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.security.auth.callback.ConfirmationCallback;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import java.awt.Color;
import java.awt.Font;
import java.awt.HeadlessException;
import java.awt.Panel;
public class panel extends JFrame {
public static Method method;
JFrame frame;
String path="";
int count = 0;
private JTextField textField;
/**
* Launch the application.
*/
public String chooseFile() {
// 弹出文件浏览窗口
JFileChooser chooser = new JFileChooser();
// 显示对话框
int res = chooser.showOpenDialog(this);
// 如果点击的是确认按钮
if (res == JFileChooser.APPROVE_OPTION) {
File file = chooser.getSelectedFile();
textField.setText(file.getAbsolutePath());
path=chooser.getSelectedFile().getPath();
return path;
}
return null;
}
public void closeThis() {
frame.dispose();
}
/**
* Create the application.
*/
public panel() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setFont(new Font("Dialog", Font.BOLD | Font.ITALIC, 12));
frame.setTitle("\u56DE\u6587\u5206\u6790");
frame.getContentPane().setBackground(new Color(152, 251, 152));
frame.getContentPane().setForeground(new Color(255, 215, 0));
frame.setBounds(100, 100, 410, 218);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
Button button = new Button("\u9009\u62E9");
button.setBackground(new Color(192, 192, 192));
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
chooseFile();
}
});
button.setBounds(303, 50, 62, 24);
frame.getContentPane().add(button);
textField = new JTextField();
textField.setBounds(72, 50, 222, 24);
frame.getContentPane().add(textField);
textField.setColumns(10);
JLabel lblNewLabel = new JLabel("\u9009\u62E9\u6240\u5904\u7406\u6587\u4EF6\u5730\u5740\uFF1A");
lblNewLabel.setFont(new Font("宋体", Font.BOLD | Font.ITALIC, 16));
lblNewLabel.setBounds(86, 13, 208, 24);
frame.getContentPane().add(lblNewLabel);
frame.setLocationRelativeTo(getOwner());
JButton btnNewButton = new JButton("\u786E\u5B9A");
btnNewButton.setBackground(new Color(192, 192, 192));
btnNewButton.setForeground(new Color(0, 0, 0));
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
closeThis();
bobo window = new bobo();
window.frame.setVisible(true);
window.frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
});
btnNewButton.setBounds(303, 90, 62, 24);
frame.getContentPane().add(btnNewButton);
}
}
主方法类
package Struction;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import java.awt.Color;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.LayoutStyle.ComponentPlacement;
import javax.swing.JTextField;
import javax.swing.RepaintManager;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Panel;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.nio.file.Path;
import java.util.concurrent.CountDownLatch;
import javax.swing.JTextArea;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;
import javax.swing.JButton;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import Struction.panel;
//对栈类进行定义
class Stack2 {// 顺序栈是栈的顺序实现
private String[] s; // 使用数组来存贮栈中的元素,入栈和出栈都在栈顶进行
private int top = -1 ;// 栈的索引 top表示栈顶,初始化为-1,栈顶的位置随出栈和入栈操作变化而变,需要设置top来记录当前栈顶元素在数组中的位置。
// 构造方法
/*
(1)使用txt文件存储英文文章
(2)统计英文文章单词总数
(3)统计英文文章中回文单词数
(4)计算文章中的回文单词比率
*/
public Stack2(int n) {
s = new String[n];
}
// 入栈--push
public void push(String value) {
// 判断栈是否满
if (isFull()) {
System.out.println("栈满了");
}
s[++top] = value;// 先运算,再++
}
// 出栈--pop,将栈顶的数据返回
public String pop() {
// 判断栈是否空
if (isEmpty()) {
// 抛出异常
throw new RuntimeException("栈空,没有数据");
}
return s[top--];// 先赋值,再--
}
//栈空
public boolean isEmpty() {
return top == -1;
}
//栈满
public boolean isFull() {
return top == s.length - 1;
}
//栈的长度
public int size() {
return top + 1;
}
}
public class bobo extends panel {
// 面板变量
JFrame frame;
private JTextField text1;// 文本框
private JTextField text2;
private JTextField text3;
public static String path1;
private JScrollPane scrollPane;// 滚动面板
private JTextArea Context; // 文本域
static panel p = new panel();
static int sum;
static int number1;
static double number2;
static String s1 = "";
static String[] s2;
static String s3 = "";
// 用于判断传入的文章是否是字母,如果字符为字母,则返回 true;否则返回 false。
private static boolean ifword(String s) {
if (s.length() == 0) {
return false;
}
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (!Character.isLetter(c)) {
return false;
}
}
return true;
}
private static boolean start(String s) {
Stack2 st = new Stack2(s.length());//确定st的长度
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
st.push(c + ""); //将读取的逐个字符入栈
}
String s1 = "";
for (int i = 0; i < s.length(); i++) {
s1 = s1 + st.pop();// 出栈
}
if (s.equals(s1)) { // 判断进出是否相同,相同返回true,不相同返回false
return true;
}
return false;
}
//按照题意,将大写字母转化为小写字母
private static String panduan(String s) {
String ds = "";
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (Character.isLetter(c)) {
if (Character.isUpperCase(c)) {
c = Character.toLowerCase(c);
}
ds = ds + c;
}
}
return ds;
}
// 通过调用spilt方法将文章每个单词逐个存入数组中,但是其中混有.,并且规范每一行的单词数,每行最多16个单词
private static String sort(String en) {
String[] a = en.split(" ");
String Sorten = " ";
for (int i = 0; i < a.length; i++) {
Sorten = Sorten + a[i] + " ";
if (i % 15 == 0 && i != 0) {
Sorten = Sorten + "\r\n";
}
}
return Sorten;
}
// 通过选择文件弹窗,获得地址,将地址传入到bufferedReader io流读取文件信息
public static void main(String[] args) throws Exception {
BufferedReader b = new BufferedReader(new FileReader(p.chooseFile()));
String en;
// 表示每次读取一行数据 直到为空退出循环, 对文本进行分隔 换行 排序
while ((en = b.readLine()) != null) {
s1 += en + " ";
en = sort(en);// 对文本进行分隔 换行 排序
s3 += en + "\r\n";
}
s2 = s1.split(" ");
Stack2 stack = new Stack2(s2.length);
for (String s : s2) { // 遍历每个元素
s = panduan(s);// 判断是否是大写字母
if (ifword(s)) {// 判断是否是字母
if (start(s)) {// 判断是否回文
number1++;
}
if (s.length() != 0) {
stack.push(s);
}
}
}
sum = stack.size();
number2 = ((double) number1 / (double) sum); //求回文率
b.close();//关闭流
EventQueue.invokeLater(new Runnable() { ///它封装了异步事件指派机制,该机制从队列中提取事件,不允许同时从该队列中指派多个事件。 按顺序指派。
public void run() {
try {
panel p = new panel();
p.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public bobo() {
initialize();
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frame = new JFrame();
frame.setResizable(false);
frame.getContentPane().setBackground(Color.YELLOW);
frame.getContentPane().setForeground(Color.BLACK);
frame.setBounds(100, 100, 786, 652);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(getOwner());
JLabel lable = new JLabel("\u82F1\u6587\u6587\u7AE0");
lable.setBounds(14, 159, 156, 46);
lable.setFont(new Font("宋体", Font.PLAIN, 39));
JLabel label1 = new JLabel("\u5355\u8BCD\u603B\u6570:");
label1.setBounds(29, 291, 88, 21);
label1.setFont(new Font("宋体", Font.PLAIN, 18));
JLabel label2 = new JLabel("\u56DE\u6587\u5355\u8BCD\u6570:");
label2.setBounds(29, 343, 99, 21);
label2.setFont(new Font("宋体", Font.PLAIN, 18));
JLabel label3 = new JLabel("\u56DE\u6587\u7387:");
label3.setBounds(29, 401, 78, 21);
label3.setFont(new Font("宋体", Font.PLAIN, 18));
text1 = new JTextField();
text1.setBounds(29, 312, 42, 24);
text1.setEditable(false);
text1.setColumns(10);
text2 = new JTextField();
text2.setBounds(29, 364, 42, 24);
text2.setEditable(false);
text2.setColumns(10);
text3 = new JTextField();
text3.setBounds(29, 424, 141, 21);
text3.setEditable(false);
text3.setColumns(10);
text1.setText("" + sum);
text2.setText("" + number1);
String sh = "" + (number2 * 100);
text3.setText("" + sh + "%");
scrollPane = new JScrollPane();
scrollPane.setBounds(184, 0, 584, 605);
scrollPane.setBackground(Color.WHITE);
scrollPane.setForeground(Color.WHITE);
scrollPane.setEnabled(false);
frame.getContentPane().setLayout(null);
frame.getContentPane().add(label2);
frame.getContentPane().add(label1);
frame.getContentPane().add(text1);
frame.getContentPane().add(text2);
frame.getContentPane().add(label3);
frame.getContentPane().add(text3);
frame.getContentPane().add(lable);
frame.getContentPane().add(scrollPane);
Context = new JTextArea();
scrollPane.setViewportView(Context);
Context.setEditable(false);
Context.setForeground(Color.WHITE);
Context.setFont(new Font("Monospaced", Font.PLAIN, 16));
Context.setBackground(Color.PINK);
Context.setText(s3);
}
}
如有问题,感谢指出!