• 1.28 MB
  • 2022-09-27 发布

6数据结构课程设计报告java实现(停车场管理-运动会成绩管理-哈弗曼压缩)

  • 109页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档由用户上传,淘文库整理发布,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,请立即联系网站客服。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细阅读内容确认后进行付费下载。
  4. 网站客服QQ:403074932
数据结构课程设计实验报告题目一:学生运动会成绩管理题目二:停车场管理题目三:哈弗曼编译器姓名:李众力学号:0909103001专业班级:物联网工程10022016年11月15日\n目录程序一:学生运动会成绩管理(JAVA)............................................................................................1一、需求分析:.........................................................................................................................1二、概要设计.............................................................................................................................2三、详细设计.............................................................................................................................4四、调试分析:.........................................................................................................................9五、用户手册:.......................................................................................................................10附:程序源代码.......................................................................................................................12Data.java.........................................................................................................................12ItemNode.java.................................................................................................................13MainUI.java.....................................................................................................................15MyTable.java...................................................................................................................32ResTab.java.....................................................................................................................35ResTab2.java...................................................................................................................38SchoolNode.java.............................................................................................................40Tools.java.......................................................................................................................43程序二:停车场管理(JAVA)..........................................................................................................46一、需求分析:.......................................................................................................................46二、概要设计:.......................................................................................................................46三、详细设计:.......................................................................................................................47四、调试分析:.......................................................................................................................49五、用户手册:.......................................................................................................................52附录:.......................................................................................................................................54CarInfo.java...................................................................................................................54Data.java.........................................................................................................................54ListNode.java.................................................................................................................58MyListQueue.java...........................................................................................................59MyStack.java...................................................................................................................61UI.java.............................................................................................................................64程序三:哈弗曼编译器(JAVA)..................................................................................................71一、需求分析.......................................................................................................................71二、概要设计:.......................................................................................................................71三、详细设计:.......................................................................................................................72四、调试分析:.......................................................................................................................75五、测试结果:.......................................................................................................................79附1:基础版源代码................................................................................................................80Code.java.........................................................................................................................80HafNode.java...................................................................................................................81Line.java.........................................................................................................................83MainF.java.......................................................................................................................84MyWindow.java.................................................................................................................89Shape.java.......................................................................................................................90Word.java.........................................................................................................................91附2:完整版版源代码............................................................................................................93Code.java.........................................................................................................................93HafNode.java...................................................................................................................94LoadFile.java.................................................................................................................96readFile.java...............................................................................................................100\n数据结构课程设计报告——0909103001物联网1002班李众力程序一:学生运动会成绩管理(JAVA)一、需求分析:本程序的主要用途是对学生运动会成绩进行输入、存储以及查询。本程序有以下几个功能模块:1.学校信息输入模块:本模块功能为输入学校的名称以及编号,由于编号必须为唯一,且按照顺序,所以本程序只允许用户进行学校名称的输入,学校编号自动生成,当输入学校名称为空或者重复是会有错误提示。2.项目信息输入模块:此模块用于添加运动会项目,项目分为男子大项、男子小项、女子大项以及女子小项四个类别,大项取前五名,小项取前三名。为了防止用户输入错误,项目类型为下拉列表供用户选择,项目编号为自动生成,当输入项目名称为空或项目名称重复是会有错误提示。3.成绩输入模块:此模块功能为输入各学校在各项目上所取得的名次,同样为了防止用户输入错误,项目名称、学校名称以及取得名次都是从下拉列表中选择,当成绩输入重复时(一个学校在同一项目上取得不同名次、不同学校在一个项目上取得相同名次)都会提示错误信息。4.成绩信息保存模块:此模块对于输入的信息进行保存,将数据从内存中爆出到硬盘的文件中,使数据持久保存。5.成绩排序模块:此模块可以将学校按照学校编号、项目总分、男子项目总分、女子项目中分进行升序、降序的排序,方便对成绩有一个直观的了解。6.成绩信息读取模块:此模块可以将以前保存在硬盘中的数据读取出来,并将数据提供给其他模块进行相应操作。7.成绩查询模块:此模块可以按多种方式对输入的数据进行查询:可以按照学校编号查询该学校在哪些项目上获得了什么名次或者在某一个项目上获得了什么名次,也可以按照项目编号查询都有那些学校在该项目上取得了名次,如果项目编号或者学校编号输入错误会有错误提示信息。1\n数据结构课程设计报告——0909103001物联网1002班李众力二、概要设计本程序有两个自定义的数据类,学校类(SchoolNode)和项目类(ItemNode),分别用来保存参加的学校的信息以及项目的信息。2\n数据结构课程设计报告——0909103001物联网1002班李众力Data类存放着程序运行时的数据,以及保存打开的操作另外Tools类为对于数据操作的具体方法:本程序通过界面与用户进行交互,有界面类MainUI以及界面的配置类。3\n数据结构课程设计报告——0909103001物联网1002班李众力三、详细设计1.输入学校信息模块功能框图如下:输入学校名称是是否为空,是否重复否自动编号添加对象至学校信息队列关键代码:publicvoidactionPerformed(ActionEvente){na=SclName.getText();if(!na.equals("")&&to.checkScl(na)){intn=da.getSlist().size();jTextField1.setText((n+1)+"");to.addScl(na,n+1);n=da.getSlist().size();jTextField1.setText((n+1)+"");SclName.setText("");javax.swing.JOptionPane.showMessageDialog(null,"添加成功!");jComboBox_SclName.addItem(na);}else{javax.swing.JOptionPane.showMessageDialog(null,"名称重复或为空!");}}2.输入项目信息模块功能框图如下:项目名称及类别是是否为空,是否重复否自动编号添加对象至项目信息队列4\n数据结构课程设计报告——0909103001物联网1002班李众力关键代码:publicvoidactionPerformed(ActionEvente){na=jTextField2.getText();if(to.checkItem(na)&&(!na.equals(""))){intn=da.getIlist().size();booleanisMan,isBig;jTextField3.setText(""+n+1);if(jComboBox_setItem.getSelectedItem().equals("男子大项")){System.out.println("男子大项");isMan=true;isBig=true;}elseif(jComboBox_setItem.getSelectedItem().equals("男子小项")){System.out.println("男子小项");isMan=true;isBig=false;}elseif(jComboBox_setItem.getSelectedItem().equals("女子大项")){System.out.println("女子大项");isMan=false;isBig=true;}else{System.out.println("女子小项");isMan=false;isBig=false;}to.addItem(na,n+1,isBig,isMan);n=da.getIlist().size();jTextField3.setText((n+1)+"");jTextField2.setText("");javax.swing.JOptionPane.showMessageDialog(null,"添加成功!");jComboBox_Item.addItem(na);}else{javax.swing.JOptionPane.showMessageDialog(null,"名称重复或为空!");}}5\n数据结构课程设计报告——0909103001物联网1002班李众力3.输入比赛成绩信息模块:学校的成绩信息是输入数据是否错误否添加成绩信息到相应学校添加学校信息到相应项目判断语句在鼠标监听器中,具体代码如下:publicvoidactionPerformed(ActionEvente){//获得学校的名字Stringna=(String)jComboBox_SclName.getSelectedItem();//获得项目的名字StringIname=(String)jComboBox_Item.getSelectedItem();//获得取得名次StringScore=(String)(jComboBox_score.getSelectedItem());//System.out.println("学校名字"+na);//通过名字查找学校节点SchoolNodesc=to.findScByName(na);booleanch1=false;//查找学校输入过的项目名字ArrayListIN=to.findScByName(na).getItemName();//检查是否重复添加成绩for(inti=0;iSclList;//存放项目的队列privateArrayListItemList;publicData(){SclList=newArrayList();ItemList=newArrayList();}protectedArrayListgetSlist(){returnSclList;}protectedArrayListgetIlist(){returnItemList;}//保存成文件的方法publicvoidsave(){try{FileOutputStreamfos=newFileOutputStream(newFile("D://score.mdat"));12\n数据结构课程设计报告——0909103001物联网1002班李众力BufferedOutputStreambos=newBufferedOutputStream(fos);ObjectOutputStreamoos=newObjectOutputStream(bos);oos.writeObject(SclList);oos.flush();oos.writeObject(ItemList);oos.flush();javax.swing.JOptionPane.showMessageDialog(null,"保存成功!");}catch(Exceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}//从文件读取的方法//@SuppressWarnings("unchecked")//忽略下面的警告@SuppressWarnings("unchecked")publicvoidload(){try{FileInputStreamfis=newFileInputStream(newFile("D://score.mdat"));BufferedInputStreambis=newBufferedInputStream(fis);ObjectInputStreamois=newObjectInputStream(bis);SclList=(ArrayList)ois.readObject();ItemList=(ArrayList)ois.readObject();javax.swing.JOptionPane.showMessageDialog(null,"文件载入成功!");}catch(Exceptione){//TODOAuto-generatedcatchblocke.printStackTrace();}}}ItemNode.javapackage学生运动会成绩管理;importjava.io.Serializable;importjava.util.HashMap;/***运动项目类**@authorMicro*13\n数据结构课程设计报告——0909103001物联网1002班李众力*/publicclassItemNodeimplementsSerializable{/****/privatestaticfinallongserialVersionUID=1L;//属性privatebooleanisBig;//是否为大项目privatebooleanisMan;//是否为男子项目privateintnum=-1;//项目编号privateStringname="";//项目名称//存储哪些学校获得成绩的队列privateString[]Mingci;//存储每个学校该项目的成绩的图privateHashMapschools=newHashMap();publicItemNode(Stringname,intnum,booleanisBig,booleanisMan){this.name=name;this.num=num;this.isMan=isMan;this.isBig=isBig;if(isBig){Mingci=newString[]{"第一名","第二名","第三名","第四名","第五名"};}else{Mingci=newString[]{"第一名","第二名","第三名"};}}//GetSet方法publicbooleanisBig(){returnisBig;}publicbooleanisMan(){returnisMan;}publicintgetNum(){returnnum;}publicStringgetName(){returnname;}14\n数据结构课程设计报告——0909103001物联网1002班李众力publicString[]getMingci(){returnMingci;}publicHashMapgetSchools(){returnschools;}}MainUI.javapackage学生运动会成绩管理;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.util.ArrayList;importjavax.swing.ComboBoxModel;importjavax.swing.DefaultComboBoxModel;importjavax.swing.JButton;importjavax.swing.JComboBox;importjavax.swing.JLabel;importjavax.swing.JPanel;importjavax.swing.JScrollPane;importjavax.swing.JTabbedPane;importjavax.swing.JTable;importjavax.swing.JTextField;importjavax.swing.WindowConstants;importjavax.swing.table.DefaultTableModel;importjavax.swing.table.TableModel;importjavax.swing.SwingUtilities;/***ThiscodewaseditedorgeneratedusingCloudGarden'sJiglooSWT/SwingGUI*Builder,whichisfreefornon-commercialuse.IfJiglooisbeingused*commercially(ie,byacorporation,companyorbusinessforanypurpose*whatever)thenyoushouldpurchasealicenseforeachdeveloperusingJigloo.*Pleasevisitwww.cloudgarden.comfordetails.UseofJiglooimplies*acceptanceoftheselicensingterms.ACOMMERCIALLICENSEHASNOTBEEN*PURCHASEDFORTHISMACHINE,SOJIGLOOORTHISCODECANNOTBEUSEDLEGALLYFOR*ANYCORPORATEORCOMMERCIALPURPOSE.15\n数据结构课程设计报告——0909103001物联网1002班李众力*/publicclassMainUIextendsjavax.swing.JFrame{/****/privatestaticfinallongserialVersionUID=1L;{//SetLook&Feeltry{javax.swing.UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");}catch(Exceptione){e.printStackTrace();}}Datada=newData();privateJLabelname;privateJTextFieldSclName;privateJButtonBu_SclAdd;privateJButtonjButton1;privateJComboBoxjComboBox_setItem;privateJLabelchooseSex;privateJTextFieldjTextField3;privateJButtonsave;privateJComboBoxjComboBox_score;privateJLabeljLabel4;privateJButtonjButton_add;privateJLabeljLabel3;privateJTextFieldjTextField2;privateJLabeljLabel2;privateJPaneladdItem;privateJComboBoxjComboBox_Item;privateJLabelchooseItem;privateJLabelChooseName;privateJComboBoxjComboBox_SclName;privateJPanelgetScore;privateJPanelsetScore;privateJTabbedPanejTabbedPane1;privateJPaneladd;privateJLabeladdScl;16\n数据结构课程设计报告——0909103001物联网1002班李众力privateJTextFieldjTextField1;privateJLabelSclID;privateToolsto=newTools(da);privateJLabeljLabel10;privateJLabeljLabel9;privateJTextFieldjTextField5;privateJLabeljLabel8;privateJButtonjButton4;privateJLabeljLabel7;privateJTablejTable2;privateJScrollPanejScrollPane2;privateJLabeljLabel6;privateJTextFieldjTextField4;privateJComboBoxChooseWay;privateJLabeljLabel5;privateJButtonjButton3;privateJButtonjButton2;privateJTablejTable1;privateJScrollPanejScrollPane1;privateJComboBoxjComboBox2;privateJComboBoxjComboBox1;privateJLabeljLabel1;privateJPanelPaiMing;privateMyTablejTable1Model;//查询表格显示的数据privateString[][]item2=null;privateResTabrt;privateTableModeljTable2Model2;privateJLabeljLabel11;/***Auto-generatedmainmethodtodisplaythisJFrame*/publicstaticvoidmain(String[]args){SwingUtilities.invokeLater(newRunnable(){publicvoidrun(){MainUIinst=newMainUI();inst.setLocationRelativeTo(null);inst.setVisible(true);}});}publicMainUI(){17\n数据结构课程设计报告——0909103001物联网1002班李众力super();initGUI();}privatevoidinitGUI(){try{this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);getContentPane().setLayout(null);this.setResizable(false);this.setTitle("\u5b66\u751f\u8fd0\u52a8\u4f1a\u6210\u7ee9\u7ba1\u7406\u7cfb\u7edf");{jTabbedPane1=newJTabbedPane();getContentPane().add(jTabbedPane1);jTabbedPane1.setBounds(12,12,358,250);jTabbedPane1.setBackground(newjava.awt.Color(192,192,192));{add=newJPanel();jTabbedPane1.addTab("添加学校",null,add,null);add.setBounds(12,12,115,252);add.setLayout(null);add.setBackground(newjava.awt.Color(192,192,192));{addScl=newJLabel();add.add(addScl);addScl.setText("\u6dfb\u52a0\u5b66\u6821");addScl.setBounds(139,12,63,17);}{name=newJLabel();add.add(name);name.setText("\u5b66\u6821\u540d\u5b57");name.setBounds(95,41,87,17);name.setFont(newjava.awt.Font("宋体",0,12));}{SclName=newJTextField();add.add(SclName);SclName.setBounds(95,64,87,24);SclName.setFont(newjava.awt.Font("宋体",0,12));}{SclID=newJLabel();add.add(SclID);18\n数据结构课程设计报告——0909103001物联网1002班李众力SclID.setText("\u5b66\u6821\u7f16\u53f7");SclID.setBounds(95,100,87,17);SclID.setFont(newjava.awt.Font("宋体",0,12));}{jTextField1=newJTextField();add.add(jTextField1);jTextField1.setBounds(95,123,87,24);jTextField1.setFont(newjava.awt.Font("宋体",0,12));jTextField1.setEditable(false);jTextField1.setText("1");}{Bu_SclAdd=newJButton();Bu_SclAdd.addActionListener(newActionListener(){Stringna;@OverridepublicvoidactionPerformed(ActionEvente){na=SclName.getText();if(!na.equals("")&&to.checkScl(na)){intn=da.getSlist().size();jTextField1.setText((n+1)+"");to.addScl(na,n+1);n=da.getSlist().size();jTextField1.setText((n+1)+"");SclName.setText("");javax.swing.JOptionPane.showMessageDialog(null,"添加成功!");jComboBox_SclName.addItem(na);}else{javax.swing.JOptionPane.showMessageDialog(null,"名称重复或为空!");}}});add.add(Bu_SclAdd);Bu_SclAdd.setText("\u6dfb\u52a0");Bu_SclAdd.setBounds(107,159,63,24);Bu_SclAdd.setFont(newjava.awt.Font("宋体",0,12));}}{addItem=newJPanel();19\n数据结构课程设计报告——0909103001物联网1002班李众力jTabbedPane1.addTab("添加项目",null,addItem,null);addItem.setBounds(139,12,137,252);addItem.setLayout(null);addItem.setBackground(newjava.awt.Color(192,192,192));{jLabel2=newJLabel();addItem.add(jLabel2);jLabel2.setText("\u9879\u76ee\u540d\u5b57");jLabel2.setFont(newjava.awt.Font("宋体",0,12));jLabel2.setBounds(69,41,87,17);}{jTextField2=newJTextField();addItem.add(jTextField2);jTextField2.setFont(newjava.awt.Font("宋体",0,12));jTextField2.setBounds(69,64,87,24);}{jLabel3=newJLabel();addItem.add(jLabel3);jLabel3.setText("\u9879\u76ee\u7f16\u53f7");jLabel3.setFont(newjava.awt.Font("宋体",0,12));jLabel3.setBounds(69,100,87,17);}{jTextField3=newJTextField();addItem.add(jTextField3);jTextField3.setFont(newjava.awt.Font("宋体",0,12));jTextField3.setBounds(69,123,87,24);jTextField3.setText("1");jTextField3.setEditable(false);}{chooseSex=newJLabel();addItem.add(chooseSex);chooseSex.setText("\u9879\u76ee\u7ec4\u522b");chooseSex.setBounds(198,41,71,17);chooseSex.setFont(newjava.awt.Font("宋体",0,12));}{ComboBoxModeljComboBox_setItemModel=newDefaultComboBoxModel(newString[]{"男子大项","男子小项","女子大项","女子小项"});20\n数据结构课程设计报告——0909103001物联网1002班李众力jComboBox_setItem=newJComboBox();addItem.add(jComboBox_setItem);jComboBox_setItem.setModel(jComboBox_setItemModel);jComboBox_setItem.setBounds(198,63,87,24);}{jButton1=newJButton();jButton1.addActionListener(newActionListener(){Stringna;@OverridepublicvoidactionPerformed(ActionEvente){na=jTextField2.getText();if(to.checkItem(na)&&(!na.equals(""))){intn=da.getIlist().size();booleanisMan,isBig;jTextField3.setText(""+n+1);if(jComboBox_setItem.getSelectedItem().equals("男子大项")){System.out.println("男子大项");isMan=true;isBig=true;}elseif(jComboBox_setItem.getSelectedItem().equals("男子小项")){System.out.println("男子小项");isMan=true;isBig=false;}elseif(jComboBox_setItem.getSelectedItem().equals("女子大项")){System.out.println("女子大项");isMan=false;isBig=true;}else{System.out.println("女子小项");isMan=false;isBig=false;}to.addItem(na,n+1,isBig,isMan);n=da.getIlist().size();jTextField3.setText((n+1)+"");jTextField2.setText("");javax.swing.JOptionPane.showMessageDialog(21\n数据结构课程设计报告——0909103001物联网1002班李众力null,"添加成功!");jComboBox_Item.addItem(na);}else{javax.swing.JOptionPane.showMessageDialog(null,"名称重复或为空!");}}});addItem.add(jButton1);jButton1.setText("\u6dfb\u52a0");jButton1.setFont(newjava.awt.Font("宋体",0,12));jButton1.setBounds(198,123,63,24);}}{setScore=newJPanel();jTabbedPane1.addTab("输入成绩",null,setScore,null);setScore.setBackground(newjava.awt.Color(192,192,192));setScore.setLayout(null);setScore.setPreferredSize(newjava.awt.Dimension(347,223));setScore.setToolTipText("\u5b66\u751f\u8fd0\u52a8\u4f1a\u6210\u7ee9\u7ba1\u7406");{ComboBoxModeljComboBox_SclNameModel=newDefaultComboBoxModel();jComboBox_SclName=newJComboBox();setScore.add(jComboBox_SclName);jComboBox_SclName.setModel(jComboBox_SclNameModel);jComboBox_SclName.setBounds(135,66,110,24);}{ChooseName=newJLabel();setScore.add(ChooseName);ChooseName.setText("\u9009\u62e9\u5b66\u6821");ChooseName.setBounds(24,70,72,17);}{chooseItem=newJLabel();setScore.add(chooseItem);chooseItem.setText("\u9009\u62e9\u9879\u76ee");chooseItem.setBounds(24,29,72,17);}{22\n数据结构课程设计报告——0909103001物联网1002班李众力ComboBoxModeljComboBox_ItemModel=newDefaultComboBoxModel(newString[]{""});jComboBox_Item=newJComboBox();jComboBox_Item.addActionListener(newActionListener(){@OverridepublicvoidactionPerformed(ActionEvente){System.out.println("触发");if(!jComboBox_Item.getSelectedItem().equals("")){Stringname=(String)jComboBox_Item.getSelectedItem();ItemNodeit=to.findItByName(name);String[]Mingci;if(it.isBig()){Mingci=newString[]{"第一名","第二名","第三名","第四名","第五名"};jComboBox_score.setModel(newDefaultComboBoxModel(Mingci));}else{Mingci=newString[]{"第一名","第二名","第三名"};jComboBox_score.setModel(newDefaultComboBoxModel(Mingci));}}}});setScore.add(jComboBox_Item);jComboBox_Item.setModel(jComboBox_ItemModel);jComboBox_Item.setBounds(135,25,110,24);}{jButton_add=newJButton();jButton_add.addActionListener(newActionListener(){@Override23\n数据结构课程设计报告——0909103001物联网1002班李众力publicvoidactionPerformed(ActionEvente){//获得学校的名字Stringna=(String)jComboBox_SclName.getSelectedItem();//获得项目的名字StringIname=(String)jComboBox_Item.getSelectedItem();//获得取得名次StringScore=(String)(jComboBox_score.getSelectedItem());//System.out.println("学校名字"+na);//通过名字查找学校节点SchoolNodesc=to.findScByName(na);booleanch1=false;//查找学校输入过的项目名字ArrayListIN=to.findScByName(na).getItemName();//检查是否重复添加成绩for(inti=0;iqueue=newPriorityQueue();//用来接收排序结果的数组SchoolNode[]sl=newSchoolNode[]{};//设置以什么为优先对象publicvoidsetPri(inta){queue.clear();for(inti=0;igetColumnClass(intcolumnIndex){//TODOAuto-generatedmethodstubreturnString.class;}@OverridepublicbooleanisCellEditable(introwIndex,intcolumnIndex){//TODOAuto-generatedmethodstubreturnfalse;}//设置表格中的值@OverridepublicObjectgetValueAt(introwIndex,intcolumnIndex){Stringf="";34\n数据结构课程设计报告——0909103001物联网1002班李众力if(columnIndex==0){f=""+(rowIndex+1);}elseif(columnIndex==1){f="No."+sl[rowIndex].getID();}elseif(columnIndex==2){f=sl[rowIndex].getName();}elseif(columnIndex==3){f=sl[rowIndex].getmScore()+sl[rowIndex].getwScore()+"分";}elseif(columnIndex==4){f=sl[rowIndex].getmScore()+"分";}elseif(columnIndex==5){f=sl[rowIndex].getwScore()+"分";}returnf;}@OverridepublicvoidsetValueAt(ObjectaValue,introwIndex,intcolumnIndex){//TODOAuto-generatedmethodstub}@OverridepublicvoidaddTableModelListener(TableModelListenerl){//TODOAuto-generatedmethodstub}@OverridepublicvoidremoveTableModelListener(TableModelListenerl){//TODOAuto-generatedmethodstub}}ResTab.javapackage学生运动会成绩管理;importjava.util.ArrayList;importjavax.swing.event.TableModelListener;importjavax.swing.table.TableModel;35\n数据结构课程设计报告——0909103001物联网1002班李众力/***显示结果表格样式**@authorMicro**/publicclassResTabimplementsTableModel{privateSchoolNodesc1;privateArrayListItNam=newArrayList();Toolsto;publicResTab(SchoolNodesc1,Toolsto){this.sc1=sc1;ItNam.addAll(sc1.getItemName());this.to=to;}publicvoidset1Data(StringiName){ItNam.clear();ItNam.add(iName);}publicvoidsetAllData(){ItNam.clear();ItNam.addAll(sc1.getItemName());}@OverridepublicintgetRowCount(){//TODOAuto-generatedmethodstubreturnItNam.size();}@OverridepublicintgetColumnCount(){//TODOAuto-generatedmethodstubreturn3;}@OverridepublicStringgetColumnName(inta){StringS="";36\n数据结构课程设计报告——0909103001物联网1002班李众力if(a==0){S="项目编号";}elseif(a==1){S="项目名称";}else{S="排名";}returnS;}@OverridepublicClassgetColumnClass(intcolumnIndex){//TODOAuto-generatedmethodstubreturnString.class;}@OverridepublicbooleanisCellEditable(introwIndex,intcolumnIndex){//TODOAuto-generatedmethodstubreturnfalse;}@OverridepublicObjectgetValueAt(inti,intj){Stringf="";if(j==0){f=to.findItByName(ItNam.get(i)).getNum()+"";}elseif(j==1){f=ItNam.get(i);}else{f=sc1.getScore().get(ItNam.get(i));}returnf;}@OverridepublicvoidsetValueAt(ObjectaValue,introwIndex,intcolumnIndex){//TODOAuto-generatedmethodstub}@OverridepublicvoidaddTableModelListener(TableModelListenerl){//TODOAuto-generatedmethodstub37\n数据结构课程设计报告——0909103001物联网1002班李众力}@OverridepublicvoidremoveTableModelListener(TableModelListenerl){//TODOAuto-generatedmethodstub}}ResTab2.javapackage学生运动会成绩管理;importjavax.swing.event.TableModelListener;importjavax.swing.table.TableModel;publicclassResTab2implementsTableModel{ItemNodein;String[]Score;//重载构造器publicResTab2(ItemNodein){this.in=in;}@OverridepublicintgetRowCount(){if(in.isBig()){Score=newString[]{"第一名","第二名","第三名","第四名","第五名"};return5;}else{Score=newString[]{"第一名","第二名","第三名"};return3;}}@OverridepublicintgetColumnCount(){return2;}@OverridepublicStringgetColumnName(inta){38\n数据结构课程设计报告——0909103001物联网1002班李众力StringS="";if(a==0){S="名次";}else{S="学校名称";}returnS;}@OverridepublicClassgetColumnClass(intcolumnIndex){//TODOAuto-generatedmethodstubreturnString.class;}@OverridepublicbooleanisCellEditable(introwIndex,intcolumnIndex){//TODOAuto-generatedmethodstubreturnfalse;}@OverridepublicObjectgetValueAt(inti,intj){if(j==0){returnScore[i];}else{returnin.getSchools().get(Score[i]);}}@OverridepublicvoidsetValueAt(ObjectaValue,introwIndex,intcolumnIndex){//TODOAuto-generatedmethodstub}@OverridepublicvoidaddTableModelListener(TableModelListenerl){//TODOAuto-generatedmethodstub}@Override39\n数据结构课程设计报告——0909103001物联网1002班李众力publicvoidremoveTableModelListener(TableModelListenerl){//TODOAuto-generatedmethodstub}}SchoolNode.javapackage学生运动会成绩管理;importjava.io.Serializable;importjava.util.ArrayList;importjava.util.HashMap;/***学校类**@authorMicro**/publicclassSchoolNodeimplementsSerializable,Comparable{/****/privatestaticfinallongserialVersionUID=1L;//属性:编号,名字,成绩privateStringname="";//学校名称privateintID;//学校编号privateintmScore;//男子项目成绩privateintwScore;//女子项目成绩//存储项目名称的队列privateArrayListItemName=newArrayList();privateintpai;//存储具体是哪一项得了多少分的图privateHashMapscore=newHashMap();//构造方法,在构造对象时要传入名字以及编号publicSchoolNode(Stringname,intID){this.name=name;this.ID=ID;pai=ID;}publicintgetID(){40\n数据结构课程设计报告——0909103001物联网1002班李众力returnID;}publicStringgetName(){returnname;}publicHashMapgetScore(){returnscore;}//设置排序方式publicvoidsetPai(inta){if(a==0){//以ID排序pai=ID;}elseif(a==1){//以总分排序pai=wScore+mScore;}elseif(a==2){//以男子项目成绩排序pai=mScore;}else{//以女子项目成绩排序pai=wScore;}}publicintgetmScore(){returnmScore;}publicintgetwScore(){returnwScore;}publicintgetPai(){returnpai;}publicArrayListgetItemName(){returnItemName;}41\n数据结构课程设计报告——0909103001物联网1002班李众力//添加成绩的方法publicvoidaddScore(StringiName,StringScore,Toolsto){ItemNodein=to.findItByName(iName);intv=0;if(in.isBig()){if(Score.equals("第一名")){v=7;}if(Score.equals("第二名")){v=5;}if(Score.equals("第三名")){v=3;}if(Score.equals("第四名")){v=2;}if(Score.equals("第五名")){v=1;}}else{if(Score.equals("第一名")){v=5;}if(Score.equals("第二名")){v=3;}if(Score.equals("第三名")){v=2;}}score.put(in.getName(),Score);//分别统计男女项目得分if(in.isMan()){mScore+=v;}else{wScore+=v;}ItemName.add(iName);}//设置比较的方式42\n数据结构课程设计报告——0909103001物联网1002班李众力@OverridepublicintcompareTo(SchoolNodeo){intp=o.getPai();returnp-pai;}}Tools.javapackage学生运动会成绩管理;/***数据操作工具类**@authorMicro**/publicclassTools{privateDatada;publicTools(Datada){this.da=da;}//添加学校方法publicvoidaddScl(Stringname,intnum){SchoolNodesc=newSchoolNode(name,num);da.getSlist().add(sc);}//添加项目方法publicvoidaddItem(Stringname,intnum,booleanisBig,booleanisMan){ItemNodein=newItemNode(name,num,isBig,isMan);da.getIlist().add(in);}//检查学校重复的方法publicbooleancheckScl(Stringname){for(inti=0;i0){i=(i+1)%size;WaitArr[i]=WaitCar[i];}returnWaitArr;}//获取循环列表长度publicintsize(){return(rear-((front+1)%size)+size)%size+1;}}51\n数据结构课程设计报告——0909103001物联网1002班李众力五、用户手册:1、进站:界面上会实时的显示停车场还有候车场的剩余车位,正确输入信息后点击确认会提示成功讯息,将会显示车停在停车场还是候车场,并将其在其中的位置显示出来。若输入有误(车编号重复、时间输入不符合规范)将会弹出相应的错误提示信息。当存车场以及候车场全部为满时提示不能进入。2.出站:出站时要先选择在停车场内的车,并输入出战时间(真正的管理系统应该取得此时的系统时间),并根据进站时间算出应缴费用(这里假设每小时2元),为了方便,默认认为如果离站时间小于入站时间,则该车已经过夜。若输入了错误的时间,则会提示输入时间有误。若此时在候车场内有车排队等候,则让排在第一个位置的车进入停车场,并将此时的时间设为该车的入站时间。若时间输入错误,则会有相应的错误信息以进行提示。下方的状态栏将会显示停车场内发生移动的车的信息,方便与了解停车场以及候车场内的情况。52\n数据结构课程设计报告——0909103001物联网1002班李众力53\n数据结构课程设计报告——0909103001物联网1002班李众力附录:CarInfo.javapackage停车场管理;/***车辆信息类:每个车有车辆编号以及进站时间*@authorMicro**/publicclassCarInfo{//车的编号privateintcarNo;//车的停车时刻privateintinTime;privateintoutTime;publicCarInfo(intcarNo,intinTime){this.carNo=carNo;this.inTime=inTime;}publicintgetCarNo(){returncarNo;}publicintgetinTime(){returninTime;}publicvoidsetinTime(inttime){this.inTime=time;}publicintgetOutTime(){returnoutTime;}publicvoidsetOutTime(intoutTime){this.outTime=outTime;}}Data.javapackage停车场管理;importjavax.swing.DefaultComboBoxModel;importjavax.swing.JComboBox;importjavax.swing.JTextArea;54\n数据结构课程设计报告——0909103001物联网1002班李众力importjavax.swing.JTextField;/***存放数据的类**@authorMicro**/publicclassData{privateMyStackinSide;privateMyStackoutSide;privateMyListQueuewait;privateintsize1;privateintsize2;privateJTextAreajta;privateJTextFieldinSideinfo;privateJTextFieldwaitInfo;privateJComboBoxcho;/****@paramwaitInfo*显示候车区状态*@paraminSideInfo*显示停车场状态*@paramjta*显示出站时状态*@paramsize1*栈的大小*@paramsize2*队列的大小*@paramcho*选择在停车场里面的车出站*/publicData(JTextFieldinSideinfo,JTextFieldwaitInfo,JTextAreajta,intsize1,intsize2,JComboBoxcho){this.size1=size1;this.size2=size2;this.inSide=newMyStack(size1);inSide.InitStack();this.outSide=newMyStack(size1);outSide.InitStack();inSideinfo.setText("还剩"+(size1-inSide.size())+"个车位");55\n数据结构课程设计报告——0909103001物联网1002班李众力this.wait=newMyListQueue(size2);wait.InitQueue();waitInfo.setText("还剩"+(size2-wait.size())+"个位置");this.inSideinfo=inSideinfo;this.waitInfo=waitInfo;this.jta=jta;this.cho=cho;}publicMyStackgetInSide(){returninSide;}publicMyStackgetOutSide(){returnoutSide;}publicMyListQueuegetWait(){returnwait;}publicbooleancarIn(CarInfoca){if(isHave(ca.getCarNo())){returnfalse;}else{//如果停车场没满,停入停车场if(!inSide.isFull()){inSide.Push(ca);System.out.println("编号为"+ca.getCarNo()+"的车存入了停车场,位置为"+inSide.size());javax.swing.JOptionPane.showMessageDialog(null,"编号为"+ca.getCarNo()+"的车存入了停车场,位置为"+inSide.size());inSideinfo.setText("还剩"+(size1-inSide.size())+"个车位");String[]model=newString[inSide.size()];CarInfo[]mod=inSide.toArray();for(inti=0;i-1;i--){//System.out.println(caList[i]);caArr[i]=caList[i];}returncaArr;}}/***检查是否存在元素**@paramCarNo*车辆编号*@return*/publicbooleanisHave(intCarNo){for(inti=top;i>-1;i--){if(caList[i].getCarNo()==CarNo){////System.out.println("找到编号为"+CarNo+"的车");returntrue;}}//System.out.println("没有找到编号为"+CarNo+"的车");returnfalse;63\n数据结构课程设计报告——0909103001物联网1002班李众力}}UI.javapackage停车场管理;importjava.awt.BorderLayout;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjavax.swing.ComboBoxModel;importjavax.swing.DefaultComboBoxModel;importjavax.swing.JButton;importjavax.swing.JComboBox;importjavax.swing.JLabel;importjavax.swing.JPanel;importjavax.swing.JScrollPane;importjavax.swing.JTabbedPane;importjavax.swing.JTextArea;importjavax.swing.JTextField;importjavax.swing.WindowConstants;importjavax.swing.SwingUtilities;/***ThiscodewaseditedorgeneratedusingCloudGarden'sJiglooSWT/SwingGUI*Builder,whichisfreefornon-commercialuse.IfJiglooisbeingused*commercially(ie,byacorporation,companyorbusinessforanypurpose*whatever)thenyoushouldpurchasealicenseforeachdeveloperusingJigloo.*Pleasevisitwww.cloudgarden.comfordetails.UseofJiglooimplies*acceptanceoftheselicensingterms.ACOMMERCIALLICENSEHASNOTBEEN*PURCHASEDFORTHISMACHINE,SOJIGLOOORTHISCODECANNOTBEUSEDLEGALLYFOR*ANYCORPORATEORCOMMERCIALPURPOSE.*/publicclassUIextendsjavax.swing.JFrame{/****/privatestaticfinallongserialVersionUID=1L;{64\n数据结构课程设计报告——0909103001物联网1002班李众力//SetLook&Feeltry{javax.swing.UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");}catch(Exceptione){e.printStackTrace();}}privateJTabbedPanejTabbedPane1;privateJPaneljPanel1;privateJLabeljLabel3;privateJLabeljLabel4;privateJLabeljLabel5;privateJScrollPanejScrollPane1;privateJLabeljLabel6;privateJTextFieldjTextField5;privateJButtonjButton3;privateJTextAreajTextArea1;privateJComboBoxjComboBox1;privateJButtonjButton1;privateJTextFieldjTextField4;privateJTextFieldjTextField3;privateJLabeljLabel2;privateJTextFieldjTextField2;privateJTextFieldjTextField1;privateJLabeljLabel1;privateJPaneljPanel2;privateDatada;/***Auto-generatedmainmethodtodisplaythisJFrame*/publicstaticvoidmain(String[]args){SwingUtilities.invokeLater(newRunnable(){publicvoidrun(){UIinst=newUI();inst.setLocationRelativeTo(null);inst.setVisible(true);}});}65\n数据结构课程设计报告——0909103001物联网1002班李众力publicUI(){super();initGUI();}privatevoidinitGUI(){try{this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);this.setTitle("\u505c\u8f66\u573a\u7ba1\u7406");{jTabbedPane1=newJTabbedPane();getContentPane().add(jTabbedPane1,BorderLayout.CENTER);jTabbedPane1.setToolTipText("\u505c\u8f66\u573a\u7ba1\u7406");{jPanel1=newJPanel();jTabbedPane1.addTab("进站",null,jPanel1,null);jPanel1.setLayout(null);{jLabel1=newJLabel();jPanel1.add(jLabel1);jLabel1.setText("\u8bf7\u8f93\u5165\u8f66\u7f16\u53f7");jLabel1.setBounds(12,79,72,17);}{jTextField1=newJTextField();jPanel1.add(jTextField1);jTextField1.setBounds(12,102,72,24);}{jTextField2=newJTextField();jPanel1.add(jTextField2);jTextField2.setBounds(122,102,76,24);}{jLabel2=newJLabel();jPanel1.add(jLabel2);jLabel2.setText("\u8fdb\u7ad9\u65f6\u95f4");jLabel2.setBounds(122,79,48,17);}{jLabel3=newJLabel();jPanel1.add(jLabel3);jLabel3.setText("\u505c\u8f66\u573a\u72b6\u6001");jLabel3.setBounds(12,12,60,17);66\n数据结构课程设计报告——0909103001物联网1002班李众力}{jTextField3=newJTextField();jPanel1.add(jTextField3);jTextField3.setBounds(12,35,72,24);jTextField3.setEditable(false);}{jLabel4=newJLabel();jPanel1.add(jLabel4);jLabel4.setText("\u5019\u8f66\u573a\u72b6\u6001");jLabel4.setBounds(122,12,60,17);}{jTextField4=newJTextField();jPanel1.add(jTextField4);jTextField4.setBounds(122,35,76,24);jTextField4.setEditable(false);}{jButton1=newJButton();jButton1.addActionListener(newActionListener(){@OverridepublicvoidactionPerformed(ActionEvente){try{intCarNo=Integer.parseInt(jTextField1.getText());intCarTime=Integer.parseInt(jTextField2.getText());jTextField1.setText("");jTextField2.setText("");if(CarTime<0||CarTime>=24){javax.swing.JOptionPane.showMessageDialog(null,"输入的时间不合法");}else{da.carIn(newCarInfo(CarNo,CarTime));}}catch(Exceptione1){e1.printStackTrace();System.out.println("输入错误");jTextField1.setText("");67\n数据结构课程设计报告——0909103001物联网1002班李众力jTextField2.setText("");javax.swing.JOptionPane.showMessageDialog(null,"输入有误,请重新输入");}}});jPanel1.add(jButton1);jButton1.setText("\u786e\u8ba4");jButton1.setBounds(78,148,57,32);}}{jPanel2=newJPanel();jTabbedPane1.addTab("出站",null,jPanel2,null);jPanel2.setLayout(null);jPanel2.setAutoscrolls(true);{jLabel5=newJLabel();jPanel2.add(jLabel5);jLabel5.setText("\u9009\u62e9\u51fa\u7ad9\u8f66\u8f86");jLabel5.setBounds(12,12,72,17);}{ComboBoxModeljComboBox1Model=newDefaultComboBoxModel(newString[]{""});jComboBox1=newJComboBox();jPanel2.add(jComboBox1);jComboBox1.setModel(jComboBox1Model);jComboBox1.setBounds(12,35,82,24);}{jButton3=newJButton();jButton3.addActionListener(newActionListener(){@OverridepublicvoidactionPerformed(ActionEvente){try{intCarNo=Integer.parseInt(((String)jComboBox1.getSelectedItem()));//System.out.println("sadasd"+CarNo);intoutTime=Integer.parseInt(jTextField568\n数据结构课程设计报告——0909103001物联网1002班李众力.getText());if(outTime<0||outTime>=24){javax.swing.JOptionPane.showMessageDialog(null,"时间输入不合法");}else{CarInfoout=da.carOut(CarNo,outTime);intintime=out.getinTime();intouttimr=out.getOutTime();inthours;if(outtimr>intime){hours=outtimr-intime;}else{hours=outtimr-intime+24;}javax.swing.JOptionPane.showMessageDialog(null,"编号"+out.getCarNo()+"的车停车"+hours+"小时,需交"+hours*2+"元");}}catch(Exceptione2){e2.printStackTrace();javax.swing.JOptionPane.showMessageDialog(null,"时间输入错误");}jTextField5.setText("");}});jPanel2.add(jButton3);jButton3.setText("\u51fa\u7ad9");jButton3.setBounds(125,71,66,24);}{jTextField5=newJTextField();jPanel2.add(jTextField5);jTextField5.setBounds(119,37,72,21);}{jLabel6=newJLabel();jPanel2.add(jLabel6);jLabel6.setText("\u51fa\u7ad9\u65f6\u95f4");jLabel6.setBounds(119,13,48,15);69\n数据结构课程设计报告——0909103001物联网1002班李众力}{jScrollPane1=newJScrollPane();jPanel2.add(jScrollPane1);jScrollPane1.setBounds(10,105,212,128);{jTextArea1=newJTextArea();jScrollPane1.setViewportView(jTextArea1);jTextArea1.setBounds(12,200,198,21);jTextArea1.setEditable(false);jTextArea1.setPreferredSize(newjava.awt.Dimension(164,37));jTextArea1.setLineWrap(true);da=newData(jTextField3,jTextField4,jTextArea1,3,4,jComboBox1);}}}}pack();this.setResizable(false);this.setSize(243,300);}catch(Exceptione){//addyourerrorhandlingcodeheree.printStackTrace();}}}70\n数据结构课程设计报告——0909103001物联网1002班李众力程序三:哈弗曼编译器(JAVA)一、需求分析(1)初始化(Initialization)。从终端读入字符集大小n,以及n个字符和n个权值,建立赫夫曼树,并将它存于文件hfmTree中。(2)编码(Encoding)。利用已建好的赫夫曼树(如不在内存,则从文件hfmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。(3)译码(Decoding)。利用已建好的赫夫曼树将文件CodeFile中的代码进行译码,结果存入文件Textfile中。(4)输入形式是直接输入字符串的频度,输出是打印字符串的哈夫曼编码,实现测试数据的查找字符和译码。(5)用下表给出的字符集和频度的实际统计数据建立赫夫曼树,并实现以下报文的编码和译码:“THISPROGRAMEISMYFAVORITE”。二、概要设计:首先要定义组成哈夫曼数的节点类,用HafNode来表示,另外需要一个用来存储字符所对应的哈弗曼编码及编码长度的对象,我用Code类来表示:71\n数据结构课程设计报告——0909103001物联网1002班李众力题目所给出的码表,只有空格以及26个大写英文字母所对应的频率,所以为了测试功能先不用文件进行读取操作,而是直接在程序中输入字符所对应的频率,并以K-V键值对的形式存放到HashMap中://设置字符频度publicvoidsetCode(HashMapcode){code.put('',186);code.put('A',64);code.put('B',13);code.put('C',22);code.put('D',32);code.put('E',103);code.put('F',21);code.put('G',15);code.put('H',47);code.put('I',57);code.put('J',1);code.put('K',5);code.put('L',32);code.put('M',20);code.put('N',57);code.put('O',63);code.put('P',15);code.put('Q',1);code.put('R',48);code.put('S',51);code.put('T',80);code.put('U',23);code.put('V',8);code.put('W',18);code.put('X',1);code.put('Y',16);code.put('Z',1);}三、详细设计:1.建树:首先要对码表进行建树工作,将需要转化的字符串中的字符添加到一个新的HashMap中,这样可以减少树的节点数,再将节点按照频率进行有小到大的排序,每次取出队列中的前两个节点,组合成一个新的节点,再放到队列中进行排序,知道队列中只有一个节点为止,此时的节点即为根节点,根据优先队列创建哈夫曼树的代码实现如下://创建哈夫曼树publicvoidcreatHafTree(PriorityQueuequeue){72\n数据结构课程设计报告——0909103001物联网1002班李众力while(queue.size()>1){HafNodemin1,min2;min1=queue.poll();min2=queue.poll();//创建合并的节点HafNoderesult=newHafNode('0',(min1.getPl()+min2.getPl()));result.setLeft(min1);result.setRight(min2);min1.setFather(result);min2.setFather(result);queue.add(result);}root=queue.peek();}2.根据哈夫曼树获得各叶节点的哈弗曼编码:以中序遍历的方式,向左碰到枝节点时编码+0,向右+1,一直到叶结点为止。这个时候再用一个HashMap来储存字符所对应的哈弗曼编码,实现代码如下://获得各叶节点的哈弗曼编码publicvoidgetCode(HafNodea,Stringcode){if(a.getLeft()==null&&a.getRight()==null){System.out.println(a.getN()+"——的哈夫曼编码为:\t"+code);Codeb=newCode(code.length(),code);SaveCode.put(a.getN(),b);}if(a.getLeft()!=null){getCode(a.getLeft(),code+'0');}if(a.getRight()!=null){getCode(a.getRight(),code+'1');}}3.将待转化的字符串转化为哈夫曼编码://将字符串转化为哈夫曼编码串publicStringtoHaf(HashMapSaveCode,Strings){Stringhaf="";char[]msg=s.toCharArray();for(inti=0;i0){waiteString="";//清空要转化的码for(intt=0;t<8;t++){if(t"+endsint+"个0");同理,在进行读取的时候读一个int,然后将这个int转化为8位01字符串,然后再进行哈夫曼译码,注意最后一个int数据代表的是在末尾写了多少个0,所以要将补的0删除再把后面的部分进行哈夫曼译码。关键代码如下://当只剩下两个int数据时Stringlast=changeInt(bis.read());intls=bis.read();System.out.println("补了"+ls+"个0");//去除最后几个0Stringtemp;temp=last;last="";for(inti=0;i<8-ls;i++){last+=temp.charAt(i);}writes+=last;System.out.println("待检查的字符串为:"+writes);for(inti=0;i字节"+(char)(int)map.get(waitString));//System.out.println("编码长度为"+waitString.length());writes=writes.substring(waitString.length());System.out.println("剩下的字符串为:"+writes);waitString="";i=-1;}}78\n数据结构课程设计报告——0909103001物联网1002班李众力五、测试结果:经过改进后的程序已经可以用二进制保存编码数据,并且也可以编码压缩例如图片等所有的文件下图为压缩前的图片及其大小:压缩后,可以看到其大小显著下降,因为上入的重复数据很多,而哈弗曼编码的特点就是对于出现频率较高的字符以较短的编码表示,出现频率低的以长编码表示,这样以平均下来就能起到压缩数据的作用。下图为压缩后的大小:经过解压缩后,大小与源文件保持一致,说明程序已经可以实现压缩和解压缩功能。79\n数据结构课程设计报告——0909103001物联网1002班李众力附1:基础版源代码Code.javapackage哈夫曼压缩;/***存储每一个字节的哈弗曼编码和哈夫曼编码的长度**@authorMicro**/publicclassCode{//哈夫曼编码privateStringnode;//编码长度privateintn;//重载构造器publicCode(intn,Stringnode){this.n=n;this.node=node;}publicStringgetNode(){returnnode;}publicvoidsetNode(Stringnode){this.node=node;}publicintgetN(){returnn;}publicvoidsetN(intn){80\n数据结构课程设计报告——0909103001物联网1002班李众力this.n=n;}}HafNode.javapackage哈夫曼压缩;importjava.io.Serializable;/***哈夫曼树节点类**@authorMicro**/publicclassHafNodeimplementsComparable,Serializable{/****/privatestaticfinallongserialVersionUID=1L;privateHafNodefather;privateHafNodeleft;privateHafNoderight;privateintpl;privatecharn;//重载构造器publicHafNode(charn,intpl){this.n=n;this.pl=pl;}publicHafNodegetFather(){returnfather;}81\n数据结构课程设计报告——0909103001物联网1002班李众力publicvoidsetFather(HafNodefather){this.father=father;}publicHafNodegetLeft(){returnleft;}publicvoidsetLeft(HafNodeleft){this.left=left;}publicHafNodegetRight(){returnright;}publicvoidsetRight(HafNoderight){this.right=right;}publicvoidsetN(charn){this.n=n;}publicchargetN(){returnn;}publicintgetPl(){returnpl;}//设置要比较的对象@OverridepublicintcompareTo(HafNodeo){82\n数据结构课程设计报告——0909103001物联网1002班李众力//要比较的是频率的大小intP=o.getPl();returnpl-P;}}Line.javapackage哈夫曼压缩;importjava.awt.Graphics;/***直线类,继承Shape**@authorMicro**/publicclassLineextendsShape{privateintx1,y1,x2,y2;publicLine(intx1,inty1,intx2,inty2){this.x1=x1;this.y1=y1;this.x2=x2;this.y2=y2;}publicvoiddraw(Graphicsg){///设置画布颜色g.setColor(this.getColor());g.drawLine(x1,y1,x2,y2);}}83\n数据结构课程设计报告——0909103001物联网1002班李众力MainF.javapackage哈夫曼压缩;importjava.io.BufferedInputStream;importjava.io.BufferedOutputStream;importjava.io.DataInputStream;importjava.io.DataOutputStream;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.util.HashMap;importjava.util.PriorityQueue;/***测试程序**@authorMicro**/publicclassMainF{//创建根节点privatestaticHafNoderoot;//储存节点编码的图HashMapSaveCode=newHashMap();publicHashMapgetSaveCode(){returnSaveCode;}//程序入口publicstaticvoidmain(String[]args)throwsException{//储存字符出现频率的图HashMapPL=newHashMap();MainFma=newMainF();ma.setCode(PL);84\n数据结构课程设计报告——0909103001物联网1002班李众力PriorityQueuepq=newPriorityQueue();//需要转化的字符串Stringstr="THISPROGRAMISMYFAVORITE";HashMaptpl=newHashMap();char[]arr=str.toCharArray();for(inti=0;iym=ma.Setmap(ma.getSaveCode());/*******译码**********/Stringres="";//待转换的字符串Stringcov="";for(inti=0;iqueue){while(queue.size()>1){HafNodemin1,min2;min1=queue.poll();min2=queue.poll();//创建合并的节点HafNoderesult=newHafNode('0',(min1.getPl()+min2.getPl()));result.setLeft(min1);result.setRight(min2);min1.setFather(result);min2.setFather(result);queue.add(result);}root=queue.peek();86\n数据结构课程设计报告——0909103001物联网1002班李众力}//设置字符频度publicvoidsetCode(HashMapcode){code.put('',186);code.put('A',64);code.put('B',13);code.put('C',22);code.put('D',32);code.put('E',103);code.put('F',21);code.put('G',15);code.put('H',47);code.put('I',57);code.put('J',1);code.put('K',5);code.put('L',32);code.put('M',20);code.put('N',57);code.put('O',63);code.put('P',15);code.put('Q',1);code.put('R',48);code.put('S',51);code.put('T',80);code.put('U',23);code.put('V',8);code.put('W',18);code.put('X',1);code.put('Y',16);code.put('Z',1);}//获得各叶节点的哈弗曼编码publicvoidgetCode(HafNodea,Stringcode){87\n数据结构课程设计报告——0909103001物联网1002班李众力if(a.getLeft()==null&&a.getRight()==null){System.out.println(a.getN()+"——的哈夫曼编码为:\t"+code);Codeb=newCode(code.length(),code);SaveCode.put(a.getN(),b);}if(a.getLeft()!=null){getCode(a.getLeft(),code+'0');}if(a.getRight()!=null){getCode(a.getRight(),code+'1');}}//将字符串转化为哈夫曼编码串publicStringtoHaf(HashMapSaveCode,Strings){Stringhaf="";char[]msg=s.toCharArray();for(inti=0;iSetmap(HashMapSaveCode){HashMapmap=newHashMap();map.put(SaveCode.get('').getNode(),'');for(chari='A';i<='Z';i++){if(SaveCode.containsKey(i)){map.put(SaveCode.get(i).getNode(),i);}}returnmap;}88\n数据结构课程设计报告——0909103001物联网1002班李众力//打印哈夫曼树publicvoidprintTree(HafNoderoot){MyWindowjf=newMyWindow();jf.setSize(400,400);jf.setVisible(true);jf.setDefaultCloseOperation(3);drawTree(root,jf,180,50,1);}//画哈夫曼树publicvoiddrawTree(HafNodea,MyWindowjf,intx,inty,intlevel){level++;if(a.getLeft()==null&&a.getRight()==null){jf.getShapes().add(newWord(a.getN(),x,y));System.out.println("画完节点"+a.getN());}if(a.getLeft()!=null){jf.getShapes().add(newLine(x,y,x-150/level,y+10*level));drawTree(a.getLeft(),jf,x-150/level,y+10*level,level);}if(a.getRight()!=null){jf.getShapes().add(newLine(x,y,x+150/level,y+10*level));drawTree(a.getRight(),jf,x+150/level,y+10*level,level);}}}MyWindow.javapackage哈夫曼压缩;importjava.awt.Graphics;importjava.util.ArrayList;importjavax.swing.JFrame;/**89\n数据结构课程设计报告——0909103001物联网1002班李众力*重写了paint()方法的界面类**@authorMicro**/publicclassMyWindowextendsJFrame{/****/privatestaticfinallongserialVersionUID=1L;//储存所画的图形的列表ArrayListshapes=newArrayList();publicArrayListgetShapes(){returnshapes;}//重写父类绘制窗体的方法publicvoidpaint(Graphicsg){super.paint(g);//将队列中的形状取出来绘制for(inti=0;i{privateHafNodefather;privateHafNodeleft;privateHafNoderight;//字节privateintnum;//出现的频率privateintpl;//重载构造器publicHafNode(intnum,intpl){this.num=num;this.pl=pl;}//getset方法publicintgetPl(){returnpl;}publicvoidsetPl(intpl){this.pl=pl;94\n数据结构课程设计报告——0909103001物联网1002班李众力}publicHafNodegetFather(){returnfather;}publicvoidsetFather(HafNodefather){this.father=father;}publicHafNodegetLeft(){returnleft;}publicvoidsetLeft(HafNodeleft){this.left=left;}publicHafNodegetRight(){returnright;}publicvoidsetRight(HafNoderight){this.right=right;}publicintgetNum(){returnnum;}publicvoidsetNum(intnum){this.num=num;}//设置按照什么顺序排序@Override95\n数据结构课程设计报告——0909103001物联网1002班李众力publicintcompareTo(HafNodeo){//按照频率的自然顺序排序intP=o.getPl();returnpl-P;}}LoadFile.javapackage哈夫曼压缩;importjava.io.BufferedInputStream;importjava.io.BufferedOutputStream;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.IOException;importjava.util.HashMap;publicclassLoadFile{privateStringpath;privateStringpath1;privateCodeReadCode[]=newCode[256];publicLoadFile(Stringpath,Stringpath1){this.path=path;this.path1=path1;}publicvoidrealease()throwsIOException{FileInputStreamfis=newFileInputStream(path);BufferedInputStreambis=newBufferedInputStream(fis);//读取每个字节的编码长度for(inti=0;imap=Setmap(ReadCode);/************读取文件信息,转换成原来的数据写入文件*****************/writes="";waitString="";//创建文件输出流FileOutputStreamfos=newFileOutputStream(path1);BufferedOutputStreambos=newBufferedOutputStream(fos);while(bis.available()>2){writes=writes+changeInt(bis.read());//先读取一串01串//System.out.println("待检查的字符串为:"+writes);for(inti=0;i字节"//+(char)(int)map.get(waitString));//System.out.println("编码长度为"+waitString.length());writes=writes.substring(waitString.length());//System.out.println("剩下的字符串为:"+writes);waitString="";i=-1;}}waitString="";}System.out.println("还剩下:"+bis.available());Stringlast=changeInt(bis.read());intls=bis.read();System.out.println("补了"+ls+"个0");//去除最后几个0Stringtemp;temp=last;last="";for(inti=0;i<8-ls;i++){last+=temp.charAt(i);}writes+=last;System.out.println("待检查的字符串为:"+writes);for(inti=0;i字节"+(char)(int)map.get(waitString));//System.out.println("编码长度为"+waitString.length());98\n数据结构课程设计报告——0909103001物联网1002班李众力writes=writes.substring(waitString.length());System.out.println("剩下的字符串为:"+writes);waitString="";i=-1;}}}//创建映射publicHashMapSetmap(Code[]a){HashMapmap=newHashMap();for(inti=0;i0){100\n数据结构课程设计报告——0909103001物联网1002班李众力intt=bis.read();by[t]++;}//创建优先队列PriorityQueuequeue=newPriorityQueue();//把所有节点都放入队列中for(inti=0;iqueue){while(queue.size()>1){HafNodemin1,min2;min1=queue.poll();min2=queue.poll();//创建合并的节点HafNoderesult=newHafNode(min1.getNum()+min2.getNum(),min1.getPl()+min2.getPl());result.setLeft(min1);result.setRight(min2);min1.setFather(result);min2.setFather(result);queue.add(result);}root=queue.peek();}//获得各叶节点的哈弗曼编码publicvoidgetCode(HafNodea,StringCode){101\n数据结构课程设计报告——0909103001物联网1002班李众力if(a.getLeft()==null&&a.getRight()==null){//System.out.println("字节"+a.getNum()+"的哈夫曼编码为:\t"+Code);Codeb=newCode(Code.length(),Code);SaveCode[a.getNum()]=b;}if(a.getLeft()!=null){getCode(a.getLeft(),Code+'0');}if(a.getRight()!=null){getCode(a.getRight(),Code+'1');}}/***将读取的文件的字节转换成哈夫曼编码写入压缩文件1.把每个字节对应的编码长度写入文件,长度256*2.从Code数组中依次读取代表字节的哈弗曼编码,并八位八位的转化成int写入文件**@parampath1*:要压缩的文件*@parampath2*:压缩后的文件路径*@throwsIOException*/publicvoidwriteFile(Stringpath1,Stringpath2)throwsIOException{//新建文件输出流FileOutputStreamfos=newFileOutputStream(path2);//包装为缓冲流BufferedOutputStreambos=newBufferedOutputStream(fos);//先把每个字节的编码的长度写入文件(长度为256)for(inti=0;i=8)){//如果缓冲区的字节数大于等于8if(count>=8){waiteString="";//清空要转化的码for(intt=0;t<8;t++){waiteString=waiteString+writes.charAt(t);}//将writes前八位删掉if(writes.length()>8){tranString="";for(intt=8;t"+waiteString);}else{//得到第i个字节的编码信息,等待写入if(SaveCode[i]!=null){count=count+SaveCode[i].getN();writes=writes+SaveCode[i].getNode();}i++;}}//把编码没有足够8的整数倍的String补0凑8,再写入if(count>0){//编码最后补的0的个数//intendz=0;waiteString="";//清空要转化的代码for(intt=0;t<8;t++){if(t"+endz+"个0");bos.write(changeString(waiteString));bos.flush();//System.out.println("写入了->"+waiteString);}else{//System.out.println("编码区写入了->"+0+"个0");//bos.write(0);//bos.flush();}104\n数据结构课程设计报告——0909103001物联网1002班李众力/************************再次读入文件信息,对应每一个字节写入编码*********************///再次读入文件信息,对应每一个字节写入编码//用来读取数据的文件输入流FileInputStreamins=newFileInputStream(path1);//包装成缓冲流BufferedInputStreambis=newBufferedInputStream(ins);count=0;writes="";tranString="";intidata;//文件没有读完的时候while((bis.available()>0)||(count>=8)){//如果缓冲区等待字符大于等于8//System.out.println(count+"<<>>"+writes.length());if(count>=8){waiteString="";//清空要转化的码for(intt=0;t<8;t++){waiteString=waiteString+writes.charAt(t);}//删除前八位writes=writes.substring(8);count-=8;//写出一个8位的字节//System.out.println("写入了-->\t"+waiteString);intintw=changeString(waiteString);bos.write(intw);//写入到文件中bos.flush();}else{idata=bis.read();//读入idata字节,对应编码写出信息count+=SaveCode[idata].getN();writes+=SaveCode[idata].getNode();105\n数据结构课程设计报告——0909103001物联网1002班李众力//System.out.println(SaveCode[idata].getN()+"<<>>"+SaveCode[idata].getNode().length());}}//count+=SaveCode[idata].getN();//writes+=SaveCode[idata].getNode();System.out.println("count="+count);System.out.println(writes);//把count剩下的写入intendsint=0;if(count>0){waiteString="";//清空要转化的码for(intt=0;t<8;t++){if(t"+endsint+"个0");}else{bos.write(0);//写入最后补的0的个数bos.flush();System.out.println("压缩区写入了->"+0+"个0");}}/***将八位字符串转化为一个整数106\n数据结构课程设计报告——0909103001物联网1002班李众力**@params*@return*/publicintchangeString(Strings){return((int)s.charAt(0)-48)*128+((int)s.charAt(1)-48)*64+((int)s.charAt(2)-48)*32+((int)s.charAt(3)-48)*16+((int)s.charAt(4)-48)*8+((int)s.charAt(5)-48)*4+((int)s.charAt(6)-48)*2+((int)s.charAt(7)-48);}//程序入口publicstaticvoidmain(String[]args)throwsIOException{readFilerf=newreadFile();//要压缩的文件路径Stringpath="D:\\hb.bmp";//压缩后的文件路径Stringpath1="D:\\压缩后.txt";//解压缩的文件路径Stringpath2="D:\\解压后.bmp";rf.readF(path);//获得各叶节点的哈弗曼编码StringCode="";rf.getCode(root,Code);//写入压缩文件rf.writeFile(path,path1);//解压过程LoadFilerel=newLoadFile(path1,path2);rel.realease();}}107

相关文档