1、JAVA作业单词统计Java语言课程作业(第二次)题 目 第 1题 学 院 计算机学院 专 业 网络工程 班 别 09级(2)班 学 号 3109006536 姓 名 罗晓然 2011年10月24日一、课程题目 读入一个TXT文本(仅有英文单词序列组成),统计各个单词出现的次数,并以适当的图形形式表示结果。二、题目分析与设计 :1. 题目的需求: 1)按照题意,程序需要有读取TXT文本的功能; 2)读入的TXT文件仅由英文单词序列组成; 3)需要统计各个单词的出现次数; 4)需要以适当的图形形式表示结果;2. 界面设计过程及布局策略: 下图是运行时的程序界面:作为特定功能的程序,从布局上来看,
2、需要表现出“单词序列”以及“图形”两个主题部分,当然图形中也有单词标记;考虑到随着读入文件的增大,单词的数量以及单词的出现次数可能会达到一个相当的高度,因此图形部分必须是ViewPort和画板划分的形式,考虑到JAVA里SWING组件的便捷性,对于图形部分使用了一个JPanel和一个JScrollPane存放;为了便于查找特定的单词,模仿了当今大部分词典程序的设计,在左侧添加了一个列表框用于存放所有单词,双击列表框中的单词项目时,右侧的图表部分可以自动定位到相应的单词位置;而在菜单栏部分,则是“文件”菜单,菜单下有“打开”选项,通过此选项可以更换当前统计的TXT文件;程序窗体大小可自由更改,通
3、过相关处理,更改窗体大小不会影响到图表的表现;综上,我用了BorderLayout的布局方式,这种方式在这个程序中的优点是能让列表框保持一定宽度便于查找单词,同时不会影响图表为主的表现需求; 对于图表的表现形式,我才用了使用最为广泛、兼容性强的柱形图+折线图方式,并通过相应运算使得图形表现更为直观;3. 程序逻辑的实现:本程序思维导图如下:程序主要由窗体事件处理、文件操作子程序、绘图相关处理以及数据结构四部分组成;其中,窗体事件处理部分包括建立窗体、列表框事件处理、菜单事件处理、鼠标事件处理等;文件操作子程序由打开文件、处理文件数据、单词统计功能组成;本程序概要流程图如下(完整流程图见下页):
4、单词统计功能是本程序的主要功能,实现原理为,以非英文字母字符为分隔符划分字节缓存为字符串数组,然后通过比对逐个字符串是否存在于列表框中判定单词是否重复,重复则计数数组相应项计数值加一,不重复则加入到列表中。最后,单词计数数组、单词数、单词最大长度和单词最大计数作为绘制图表的主要数据用以绘图,其中单词最大长度用以确定图表的横向坐标轴单元格宽度,单词最大计数用以确定图表的高度,单词数用以确定宽度。绘图部分,使用了JPanel类的paintComponent方法通过Graohics类进行2D绘图。本程序完整流程图如下:4.所使用的开发环境:Eclipse SDK;关键代码解释及实现见流程图及注释;三
5、、测试分析运行程序,打开文件:加载窗口:移动滑块条,显示正常:双击列表框,跳转正常:缩放窗口,绘图正常:点击菜单更改文件,列表框及绘图正常:附录:源代码import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.io.*;import java.util.regex.Pattern;public class IndiWordStatistics private GraphicsEnvironment GE; private GraphicsDevice GD; private DisplayMode DM
6、; public IndiWordStatistics() /* * 获取图形显示环境信息 */ GE = GraphicsEnvironment.getLocalGraphicsEnvironment(); GD = GE.getDefaultScreenDevice(); DM = GD.getDisplayMode(); /* * 建立主窗体 */ new WinMain(); public static void main(String args) new IndiWordStatistics(); public class WinMain extends JFrame impleme
7、nts MouseListener, ActionListener private static final long serialVersionUID = 0; public List KeyList; /列表框 public DiaPanel DPanel; /主画板 public JScrollPane jsp; public JScrollBar vsb; public JScrollBar hsb; public MenuItem miOpen; /打开文件 public int counts; /单词计数数组 public int count = 0; /单词数 public in
8、t MaxLength = 0; /单词长度最大值 public int MaxCount = 0; /单词计数最大值 public String fn; /文件名 public WinMain() setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLayout(new BorderLayout(3, 3); setSize(800, 480); /* * 设置窗体居中 */ setLocation(DM.getWidth()-800)/2, (DM.getHeight()-600)/2); MenuBar mb = new MenuBar(
9、); setMenuBar(mb); Menu m = new Menu(文件, true); m.add(miOpen = new MenuItem(打开); miOpen.addActionListener(this); mb.add(m); KeyList = new List(10, false); KeyList.addActionListener(this); if(!OpenFile() System.exit(0); this.setTitle(单词统计: +fn); DPanel = new DiaPanel(this); /* * 根据单词数等信息设置画板大小 */ DPa
10、nel.setPreferredSize(new Dimension(8*MaxLength+12)*count+40, MaxCount+72); jsp = new JScrollPane(DPanel); jsp.addMouseListener(this); jsp.validate(); vsb = jsp.getVerticalScrollBar(); hsb = jsp.getHorizontalScrollBar(); getContentPane().add(Center, jsp); getContentPane().add(West, KeyList); setVisib
11、le(true); vsb.setValue(vsb.getMaximum(); public void actionPerformed(ActionEvent e) if(e.getSource() = miOpen) /* * 更换当前文件 */ if(OpenFile() setTitle(单词统计: +fn); DPanel.GWidth = 8*MaxLength+12; DPanel.setPreferredSize(new Dimension(8*MaxLength+12)*count+40, MaxCount+72); DPanel.repaint(); vsb.setValu
12、e(vsb.getMaximum(); hsb.setValue(hsb.getMinimum(); else if(e.getSource() = KeyList) /* * 定位到目标单词 */ hsb.setValue(8*MaxLength+12)*KeyList.getSelectedIndex()+40); public void mouseClicked(MouseEvent e) if(e.getSource() = jsp) DPanel.repaint(); public void mousePressed(MouseEvent e) public void mouseRe
13、leased(MouseEvent e) public void mouseEntered(MouseEvent e) public void mouseExited(MouseEvent e) public boolean OpenFile() /* * 读入文本到字节数组 */ FileDialog fd = new FileDialog(this, 请选择将要统计的TXT文件:); fd.setVisible(true); if(fd.getDirectory() = null | fd.getFile() = null) return false; File flData = new
14、File(fd.getDirectory(), fd.getFile(); fn = fd.getFile().toString(); if(fn = null) return false; KeyList.removeAll(); count = 0; byte buffer = new byte(int) flData.length(); try FileInputStream fis = new FileInputStream(flData); try fis.read(buffer); catch(IOException e) return false; catch(FileNotFo
15、undException e) JOptionPane.showMessageDialog(null, IO错误!); return false; /* * 初始化列表框及相关变量 */ String str = new String(buffer); String words = Ppile(a-zA-Z).split(str); counts = new intwords.length; for(String thisWord:words) if(!thisWord.matches(a-zA-Z+) continue; int side = getListSite(thisWord.toL
16、owerCase(); if(side MaxLength) MaxLength = thisWord.length(); count +; KeyList.add(thisWord.toLowerCase(); countsKeyList.getItemCount()-1 = 1; else countsside +; /* * 获取单词计数最大值 */ for(int i:counts) if(i MaxCount) MaxCount = i; return true; public int getListSite(String str) for(int i = 0; i KeyList.
17、getItemCount(); i+) if(str.equals(KeyList.getItem(i) return i; return -1; public class DiaPanel extends JPanel private static final long serialVersionUID = 0; WinMain Wnd; public int GWidth; public int GHeight; public DiaPanel(WinMain wnd) Wnd = wnd; GWidth = 8*Wnd.MaxLength+12; GHeight = 10; public
18、 void paintComponent(Graphics g) int lines; /行数 int lastX = 40; /上一个坐标点,用于绘制折线图 int lastY; Color ca = new Color(74, 153, 191); Color cb = new Color(83, 136, 51); Color cc = new Color(165, 22, 97); if(Wnd.MaxCount this.getHeight()-72) lines = (this.getHeight()-72)/10 + 1; else lines = Wnd.MaxCount/10
19、 + 2; lastY = lines*10-10; g.setColor(Color.WHITE); g.fillRect(0, 0, this.getWidth(), this.getHeight(); /绘制底板 g.setColor(Color.LIGHT_GRAY); /* * 绘制行线 */ for(int i = 1; i lines; i+) g.drawLine(40, i*10, this.getWidth(), i*10); g.drawLine(0, this.getHeight()-45, this.getWidth(), this.getHeight()-55); g.setColor(Color.BLACK); g.drawString(Word:, 0, this.getHeight()-50); g.drawString(Count:, 0, this.getHeight()-30); for(int i = 0; i 0; i-) g.drawString(String.valueOf(i*50), 0, lines*10-i*50-5);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1