上次做那个系统是swing+jdbc实现的,无奈被明哥一句否定,数据库连接完全体现不了数据结构的作用,哎,这就是向小弟施加压力呀。人无压力不出油,经过10天的努力,终于李刚的通讯录更新为1.1版本!

以下为设计思路,以及具体报告

————————————————————————————————————————————————————

李刚的通讯录设计实验报告

——信管1132班江锦泰

1)题目

李刚是一爱折腾的人,当然爱折腾的人均有梦想,他想当中国的盖次呢。可不,现在个人好友信息多了,复杂了,他想制作一个个人通讯录的制作管理软件。 刚好这个学期学了数据结构课,所以他准备使用数据结构知识来实现了。并考虑使用双向链表作数据结构。并制定了初步要求:

(1)每个好友信息包含姓名、性别、住址、邮编、几岁、电话、QQ、微信帐号、生日等。

(2)作为一个完整的系统,应具有友好的界面和较强的容错能力

2)需求分析

一、运到相关数据结构基础——双链表

二、不能运动数据库,即需要用到文件IO流,把人物信息记录到相关文件当中

三、需要有增删查基本功能

四、良好的交互界面

四、较好的容错能力

3)概念结构设计

人物={姓名、性别、住址、邮编、几岁、电话、QQ、微信帐号、生日}

姓名为码,电话为码(key)

4)逻辑结构设计

一、双链表,具体比较难实现,所以开展联想,双链表—>树—>以树为数据结构的集合(以下简称树集)。

二、信息存到树集。

三、树集存到data文件

四、文件—>树集—>改动数据—>文件

5)物理结构设计

一、建立data文件

二、构造人物类

三、构造树集成为人物类的集合

四、构造良好的交互界面

6)系统实现与测试

简单的一个包,AddressListTreeSet为树集

Person类里面含有人物属性集合

ShowJFrame为主界面

dat为存放人物信息的文件

这是主界面,左边是一个JList姓氏导航,下面是一个功能面板,其中,按姓名查找与按电话号码查找会读取姓名框与电话框的内容

单击导航框会跳转

添加按钮作用,如果任何一个输入为空,会报错,支持输入不知道

点击下来横杠,点击按姓名查找会进行查询

电话号码同理不做效果图

删除效果,选中任意一个,进行删除,结束后读入data

7)优缺点自我评价

一、AddressList1.1失去了1.0版本的界面美化性,也减少了界面的层数

二、缺少了修改功能,因实现比较复杂,时间又不可允许,故..

三、自己没有充分利用好时间,总是在晚上编程

四、图形交互界面以及数据结构部分内容还是不扎实,做的时候经常要看书,看CSDN,缺少效率

8)代码展示,放码过去!明哥接码!

package com.friend;import java.io.Serializable;
import java.util.Comparator;public class PersonClass implements Comparable<PersonClass>,Comparator<PersonClass>,Serializable{/*** */private static final long serialVersionUID = -262413201900983336L;String name,phonecode,sex,address,zip_code,old,qq,blog,birthday;public PersonClass(String name,String phonecode,String sex,String address,String zip_code,String old,String qq,String blog,String birthday){this.name=name;this.phonecode=phonecode;this.sex=sex;this.address=address;this.zip_code=zip_code;this.old=old;this.qq=qq;this.blog=blog;this.birthday=birthday;}public PersonClass(String element[]){name=element[0];phonecode=element[1];sex=element[2];address=element[3];zip_code=element[4];old=element[5];qq=element[6];blog=element[7];birthday=element[8];System.out.print(birthday);}public Object[] toArray(){Object[] vars = new Object[9];vars[0]=name;vars[1]=this.phonecode;vars[2]=this.sex;vars[3]=this.address;vars[4]=this.zip_code;vars[5]=this.old;vars[6]=this.qq;vars[7]=this.blog;vars[8]=this.birthday;return vars;}public String index(){return this.name.substring(0, 1);}@Overridepublic int compareTo(PersonClass o) {// TODO 自动生成的方法存根if(this.name!=o.name){return this.name.compareTo(o.name);}if(this.phonecode!=o.phonecode){return this.phonecode.compareTo(o.phonecode);}if(this.sex!=o.sex){return this.sex.compareTo(o.sex);}if(this.address!=o.address){return this.address.compareTo(o.address);}if(this.zip_code!=o.zip_code){return this.zip_code.compareTo(o.zip_code);}if(this.old!=o.old){return this.old.compareTo(o.old);}if(this.qq!=o.qq){return this.qq.compareTo(o.qq);}if(this.blog!=o.blog){return this.blog.compareTo(o.blog);}return this.birthday.compareTo(o.birthday);}@Overridepublic int compare(PersonClass o1, PersonClass o2) {// TODO 自动生成的方法存根return o1.name.compareTo(o2.name);}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getPhonecode() {return phonecode;}public void setPhonecode(String phonecode) {this.phonecode = phonecode;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}public String getZip_code() {return zip_code;}public void setZip_code(String zip_code) {this.zip_code = zip_code;}public String getOld() {return old;}public void setOld(String old) {this.old = old;}public String getQq() {return qq;}public void setQq(String qq) {this.qq = qq;}public String getBlog() {return blog;}public void setBlog(String blog) {this.blog = blog;}public String getBirthday() {return birthday;}public void setBirthday(String birthday) {this.birthday = birthday;}}class IndexComparator implements Comparator<PersonClass>{public int compare(PersonClass f1, PersonClass f2){return f1.index().compareTo(f2.index());}
}class CodeComparator implements Comparator<PersonClass>{public int compare(PersonClass f1, PersonClass f2){return f1.phonecode.compareTo(f2.phonecode);}
}
package com.friend;import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;public class AddressListTreeSet extends TreeSet<PersonClass>{/*** */private static final long serialVersionUID = -673031400092308095L;private String filename;public AddressListTreeSet(String filename){super();this.filename=filename;this.readFromFile();}public void readFromFile(){try{FileInputStream fin =  new FileInputStream(this.filename);ObjectInputStream objin=new ObjectInputStream(fin);while(true)try{this.add((PersonClass)objin.readObject());}catch (Exception e){break;}objin.close();fin.close();}catch (IOException ioe){System.out.print("集合为空");}}public void writeToFile(){try{FileOutputStream fout = new FileOutputStream(this.filename);ObjectOutputStream objout= new ObjectOutputStream(fout);Iterator<PersonClass>it=this.iterator();while(it.hasNext()){PersonClass f=it.next();System.out.print(f.toString());objout.writeObject(f);}objout.close();fout.close();System.out.print("写入成功");}catch(IOException ioe){System.out.print(ioe);}}public PersonClass search(PersonClass x,Comparator<PersonClass> c){Iterator<PersonClass>it= this.iterator();while(it.hasNext()){PersonClass f= it.next();if(c.compare(f,x)==0)return f;}return null;}
}
package com.friend;import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.util.Comparator;
import java.util.Iterator;import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;public class ShowJFrame extends JFrame implements ListSelectionListener,
ActionListener,WindowListener{/*** */private static final long serialVersionUID = -7933446592390771790L;private AddressListTreeSet book;private JList<String> list;private DefaultListModel<String> listModel;private JTable table;private DefaultTableModel tableModel;private JComboBox<Object> combobox_name;private DefaultComboBoxModel<Object> comboModel;private JTextField text_code;private JTextField text_sex;private JTextField text_address;private JTextField text_zipcode;private JTextField text_old;private JTextField text_qq;private JTextField text_blog;private JTextField text_birth;public ShowJFrame(String filename){super("通讯录");this.setBounds(250,100,941,362);this.setDefaultCloseOperation(EXIT_ON_CLOSE);this.addWindowListener(this);JSplitPane split_h=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);split_h.setDividerLocation(40);this.getContentPane().add(split_h);JSplitPane split_v=new JSplitPane(JSplitPane.VERTICAL_SPLIT);split_v.setDividerLocation(180);this.book= new AddressListTreeSet(filename);this.listModel=new DefaultListModel<String>();this.listModel.addElement("全部");this.list=new JList<String>(listModel);this.list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);this.list.addListSelectionListener(this);split_h.add(new JScrollPane(this.list));split_h.add(split_v);String[] columns={"姓名","电话号码","性别","地址","邮编","年龄","QQ","微信帐号","生日"
//              name,phonecode,sex,address,zip_code,old,qq,blog,birthday};this.tableModel=new  DefaultTableModel(columns,0);this.table=new JTable(tableModel);this.list.setSelectedIndex(0);split_v.add(new JScrollPane(table));JPanel friendpanel=new JPanel(new GridLayout(2,1));split_v.add(friendpanel);JPanel panels[]={new JPanel(),new JPanel()};for(int i=0;i<panels.length;i++){friendpanel.add(panels[i]);}panels[0].add(new JLabel(columns[0]));this.comboModel=new DefaultComboBoxModel<Object>();combobox_name=new JComboBox<Object>(this.comboModel);combobox_name.setEnabled(true);combobox_name.setEditable(true);panels[0].add(combobox_name);panels[0].add(new JLabel(columns[1]));this.text_code=new JTextField("12345678901",12);panels[0].add(text_code);panels[0].add(new JLabel(columns[2]));this.text_sex=new JTextField("男",2);panels[0].add(text_sex);panels[0].add(new JLabel(columns[3]));this.text_address=new JTextField("12345678901",25);panels[0].add(text_address);panels[0].add(new JLabel(columns[4]));this.text_zipcode=new JTextField("521000",6);panels[0].add(text_zipcode);panels[0].add(new JLabel(columns[5]));this.text_old=new JTextField("21",2);panels[0].add(text_old);panels[0].add(new JLabel(columns[6]));this.text_qq=new JTextField("12345678901",12);panels[0].add(text_qq);panels[0].add(new JLabel(columns[7]));this.text_blog=new JTextField("12345678901",12);panels[0].add(text_blog);panels[0].add(new JLabel(columns[8]));this.text_birth=new JTextField("12345678901",12);panels[0].add(text_birth);this.addIndex();String buttonstr[]={"添加","按姓名查找","按电话号码查找","删除行"};JButton buttons[]=new JButton[buttonstr.length];for(int i=0;i<buttons.length;i++){buttons[i]=new JButton(buttonstr[i]);panels[1].add(buttons[i]);buttons[i].addActionListener(this);}this.setVisible(true);}private void addIndex(){Iterator<PersonClass>it=this.book.iterator();while(it.hasNext()){String indexstr=it.next().index();if(!this.listModel.contains(indexstr)){this.listModel.addElement(indexstr);this.comboModel.addElement(indexstr);}}}@Overridepublic void windowOpened(WindowEvent e) {}@Overridepublic void windowClosing(WindowEvent e) {this.book.writeToFile();System.out.print("写出程序启动");}@Overridepublic void windowClosed(WindowEvent e) {}@Overridepublic void windowIconified(WindowEvent e) {}@Overridepublic void windowDeiconified(WindowEvent e) {}@Overridepublic void windowActivated(WindowEvent e) {}@Overridepublic void windowDeactivated(WindowEvent e) {}@Overridepublic void actionPerformed(ActionEvent e) {String name=(String)combobox_name.getSelectedItem();String code=text_code.getText();String sex=text_sex.getText();String address=text_address.getText();String zipcode=text_zipcode.getText();String old=text_old.getText();String qq=text_qq.getText();String blog=text_blog.getText();String birth=text_birth.getText();if(e.getActionCommand().equals("添加")){PersonClass f = new PersonClass(name,code,sex,address,zipcode,old,qq,blog,birth);if(name==null){JOptionPane.showMessageDialog(this, "不能添加姓名为空对象");}else if(!name.equals("")){this.book.add(f);String surname=f.index();if(list.getSelectedValue().equals(surname))tableModel.addRow(f.toArray());else{if(!listModel.contains(surname)){listModel.addElement(surname);comboModel.addElement(surname);}list.setSelectedValue(surname, true);}}else {JOptionPane.showMessageDialog(this, "不能添加姓名空串或重复对象"+f.toString());}}if(!this.book.isEmpty()&&e.getActionCommand().endsWith("查找")){for(int i=tableModel.getRowCount()-1;i>=0;i--)this.tableModel.removeRow(i);if(e.getActionCommand().equals("按姓名查找"))this.addAll(new PersonClass(name,"","","","","","","",""),new PersonClass(name,"","","","","","","",""));else{PersonClass find=this.book.search(new PersonClass("",code,"","","","","","",""), new CodeComparator());if(find!=null)this.tableModel.addRow(find.toArray());}return;}if(e.getActionCommand().equals("删除行")){if(this.book.isEmpty())JOptionPane.showMessageDialog(this,"表格空,不能删除数据项。");else{int i=table.getSelectedRow();if(i==-1)JOptionPane.showMessageDialog(this,"请选择数据项");else{name=(String)table.getValueAt(i, 0);int yes=JOptionPane.showConfirmDialog(null, "删除\""+name+"\"行?");if(yes==0){code=(String)table.getValueAt(i, 1);sex=(String)table.getValueAt(i, 2);address=(String)table.getValueAt(i, 3);zipcode=(String)table.getValueAt(i, 4);old=(String)table.getValueAt(i, 5);qq=(String)table.getValueAt(i, 6);blog=(String)table.getValueAt(i, 7);birth=(String)table.getValueAt(i, 8);System.out.print(birth);PersonClass f=new PersonClass(name,code,sex,address,zipcode,old,qq,blog,birth);this.book.remove(f);tableModel.removeRow(i);if(this.book.search(f, new IndexComparator())==null){listModel.removeElement(f.index());comboModel.removeElement(f.index());}}}}}}@Overridepublic void valueChanged(ListSelectionEvent e) {String surname=(String)list.getSelectedValue();if(!this.book.isEmpty()&&surname!=null&&surname!=""){for(int i= this.tableModel.getRowCount()-1;i>=0;i--)this.tableModel.removeRow(i);if(surname=="全部")this.addAll();else this.addAll(new PersonClass(surname,"","","","","","","",""),new IndexComparator());}}private void addAll(PersonClass friend,Comparator<PersonClass> c){Iterator<PersonClass> it =this.book.iterator();while(it.hasNext()){PersonClass f= it.next();if(c==null||c.compare(friend,f)==0)this.tableModel.addRow(f.toArray());}}private void addAll(){this.addAll(null,null);}public static void main(String args[]){new ShowJFrame("E:\\作业本\\AddressList1.1\\src\\data\\通讯录.dat");}
}

继明哥的否定之后,java泰又出新作!明哥接码!相关推荐

  1. 深入理解java虚拟机 (周志明)JVM个人总结

    JIT:即时编译器,把class中的字节码翻译成CPU上可以直接执行的二进制指令.新的JIT不仅是编译,可以分析字节码是否可以优化,它可以将那些经常执行的字节码片段(热点代码)进行缓存. java虚拟 ...

  2. 深入理解Java虚拟机(周志明版)总结—WSYW126

    1.Java的内存区域与内存溢出异常(常见内存溢出错误解决办法): a) Java Heap 溢出:java堆用于存储对象实例,我们只要不断的创建对象,并且保证GC Roots到对象之间有可达路径来避 ...

  3. python富翁与陌生人编程_GitHub近10万星:印度小哥用Python和Java实现所有AI算法

    原标题:GitHub近10万星:印度小哥用Python和Java实现所有AI算法 又到了招聘季.疫情将我们圈在家里这么长时间,以至于都宅废了! AI的算法你还记得多少?他们都是如何用Python和Ja ...

  4. 结合今日头条技术架构浅谈Java后台开发一些经验 - 立哥技术

    - 剑气纵横三万里,一剑光寒九百州 前言:Java语言开发的后台系统(VUE架构),整合Swagger API,相较其他框架结构,有着语言简单,配置方便,轻量化,结构安全稳定的优点.今日头条在这3-5 ...

  5. java基于寄存器_周志明的《深入理解JAVA虚拟机》中基于栈的指令集和基于寄存器的指令集,要好好学习...

    这个知识点是我以前没有的,所以我以前发贴表示完全不理解JAR字节码的执行过程及以本地代码交互的过程. 现在有了这个知识点. 那对JVM的运行机制就了解了大概了. 周志明的<深入理解JAVA虚拟机 ...

  6. 在java中写出html代码,在java里写html代码

    在java里写html代码 [2021-02-09 07:31:38]  简介: php去除nbsp的方法:首先创建一个PHP代码示例文件:然后通过"preg_replace("/ ...

  7. 基于JAVA中小型饭馆餐饮管理系统计算机毕业设计源码+系统+数据库+lw文档+部署

    基于JAVA中小型饭馆餐饮管理系统计算机毕业设计源码+系统+数据库+lw文档+部署 基于JAVA中小型饭馆餐饮管理系统计算机毕业设计源码+系统+数据库+lw文档+部署 本源码技术栈: 项目架构:B/S ...

  8. 基于JAVA社区养老服务管理系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署

    基于JAVA社区养老服务管理系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署 基于JAVA社区养老服务管理系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署 本源码技术栈: ...

  9. 基于JAVA校园爱心志愿系统计算机毕业设计源码+数据库+lw文档+系统+部署

    基于JAVA校园爱心志愿系统计算机毕业设计源码+数据库+lw文档+系统+部署 基于JAVA校园爱心志愿系统计算机毕业设计源码+数据库+lw文档+系统+部署 本源码技术栈: 项目架构:B/S架构 开发语 ...

最新文章

  1. 以Lazada为例,看电商系统架构演进
  2. 每日一皮:程序员最讨厌的四件事!
  3. 网站推广——seo优化对企业网站推广能力的提升有着不小的帮助
  4. python语言能干什么-学Python语言可以做什么?
  5. iOS - Swift NSSize 尺寸
  6. OpenCV视频加速Video acceleration的实例(附完整代码)
  7. WCF 调用webservice
  8. form表单回车提交问题
  9. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第25篇]使用特殊的素数定义GF(p)和GF(2^n)的方法
  10. 层次聚类 matlab代码_聚类算法解析一
  11. 前端html面试题及答案2019,前端面试题及答案2019-20210415034948.docx-原创力文档
  12. Apache配置支持目录浏览
  13. flask 请求上下文
  14. Git与GitHub安装与配置
  15. catia逆向建模步骤_catia与逆向工程
  16. matlab 多项式输入,MATLAB多项式
  17. 时间计算题100道_【高中政治】选择题里面的计算题怎么办(汇率篇)
  18. 用crontab每隔1分钟执行一个命令行脚本
  19. 席慕蓉的话,足以震碎整个心
  20. 记一次升级了编译器后VSCode中产生的问题

热门文章

  1. tf.nn.dynamic_rnn返回值详解
  2. php学习报告_论坛PHP报告
  3. 【枚举】Broken Necklace
  4. 《图解经济学》读后感
  5. 网卡属性全是英文怎么搞
  6. Chrome中实现使用迅雷一次性选中并下载网页内全部链接的方法
  7. 电容的区别,关键在于介质
  8. google账户配置foxmail和使用foxmail
  9. [Jquery]天气接口简单使用
  10. (完结项目)fpga采集双路CCD摄像头1000帧图像上传到上位机显示