精华全集 冲广角币 获取广角币的更多方法
【名称】:由一个简单的程序谈起――之五(精华)
【作者】:江苏 无锡 缪小东
【格式】:PDF
【页数】:9
【语言】:中文
【出版社】:
【出版日期】:
【摘要或目录】:
本篇和大家讨论该“学生管理系统”的核心部分――一个特殊的数据结构。该数据结构的名称为DLinkedStuCollection即一个双向的链表,可以完成向前向后的遍列,同时还能在内存中没有数据时自动从文件系统加载记录,还可以在内存中的数据到达某个极限的时候将某些记录保存到文件了! import java.io.Serializable; import java.util.*; import java.io.*; public class DLinkedStuCollection implements DOA{ DOAFileUtil util = new DOAFileUtil(); //一个比较重要的内部类,主要完成和文件系统的交互 //其实完全可以放在本类中,主要为了隐藏和文件交互的细节 public static final int DEFAULTSIZE = 400 ; //内存中最多保存记录的数目,可以自行更改 public static final int STU_NUM = 50; //每个文件中最多保存记录的数目 //这两个参数可以设计成用户可以设置的,省略了! private int capacity ; //内存可以包含记录的容量 private int size = 0 ; //内存中已经有的记录的数目 int cursor = 0 ; //当前指针的位置,用于记录游标的位置 StuNode curr = null ; //当前的节点,和游标的位置对应 StuNode header = new StuNode(null,null,null); //一个双向链表的标准的头 private static class StuNode /**implements Serializable*/ { //学生的节点,保存学生记录和前后指针 StuNode prev ; //前一个节点的指针 Student elem ; //本节点的实际内容 StuNode next ; //下一个节点的指针 StuNode(StuNode prev,Student elem,StuNode next ){ this.prev=prev ; this.elem=elem; this.next=next ; } } //这是一个双向链表中典型的节点的构造方法 public DLinkedStuCollection(int initialCapacity){ //构造器,控制链表的最大容量 header.prev=header.next=header; //默认时头连接它本身!为什么?仔细研究吧! capacity = Math.max(initialCapacity,DEFAULTSIZE); //确认最小容量为400 size = 0 ; //刚开始肯定没有元素 cursor = 0 ; //刚开始游标的位置肯定为0 curr = header; //刚开始当前节点肯定为头了 } public DLinkedStuCollection(){ //默认构造器,使用默认的参数呗
2
this(DEFAULTSIZE ); } public void add(Student stu)throws Exception{ //在当前位置的后面添加一个记录 if(size>=capacity){ //增加的时候,超过最大容量时会保存部分元素 if(cursor < (capacity/2)){ //游标在链表的前端,保存后端50个元素 util.saveBack(); //保存后端,是在内部类中完成的 }else{ util.saveHeader(); //保存前端,是在内部类中完成的 } } StuNode added = new StuNode(curr,stu,curr.next); //创建一个新的节点 curr.next.prev= added; //注意节点指针的变化哦!顺序绝对不要乱! curr.next=added; curr=curr.next; //以上是在当前节点的后面添加一个节点 cursor++; size++; //这个过程游标、元素的个数以及当前节点都要变动 System.out.println(" "+stu.getName() + "添加了!!!!"); //调试方法哦! } //记好了加入后游标指到加入元素的位置,与后面的方法有差异哦
[hide][/hide]