'Cypher

事缓则圆 勿忘初心

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

20180918 数据结构及线性表

声明:此为老师上课笔记相关整理,如有错误之处请指出

 

¦ 整本书讲的是模仿JDK的集合,然后写出属于自己的集合

¦ 什么是数据?

  • 有用的信息才能称为数据

  →数据结构中所指的数据指内存中的数据 

  →java对象

 

¦ 什么是数据结构?

  • Java对象(数据)在内存中存放的形式,因为Java的数据类型分为简单类型和引用类型
    • 简单类型
      • byte short int long
      • float double
      • boolean char
    • 引用类型
      • 接口类型
      • 数组类型
      • 枚举类型
      • 注解类型
      • Tips:String也是引用类型的
  • 图解:内存机制分为栈区与堆区
    • 栈区
      • 像格子一样存放
      • 简单类型的变量 他的变量名与变量直接存储
      • 引用类型在栈区只储存名 引用类型数据存储在堆区 (e.g.字符串,new出一个新的对象)↓ 
    • 堆区
      • 存放在栈区声明的引用变量的变量
      • 如果在堆区new了一个新的对象,他的属性与在栈区new的对象的属性放在一起
      • 而属性名所对应的数据另外存放在另一个池子里面

      

¦ 程序 = 数据结构 + 算法

  • 在数据结构中封装算法
  • 经典的集合数据结构
    • 线性表
      • *老师主要讲解了线性表
      • 线性表的优点:有序,有索引维护,元素可以重复;可做基本的增,删,改,查操作;类似jdk中的list接口
      • 分为:
        • a.顺序表
        • b.链表
    • 队列

 讲解代码:

  • 下面的代码分别为:接口类,实现类,测试类
 1 /**
 2  * @author Cypher
 3  * @date 2018.09.18
 4  * 这个类是接口的,实现类是另一个类
 5  * 
 6  * */
 7 public interface Ilist {
 8     //顺序表是可以自己扩容的
 9     
10     //顺序表完成自己的增删改查的动作
11     
12     //增(封装两个方法):一个是在中间添加对象;一个是在末尾添加对象
13         //在集合i位置插入obj对象,i后的元素全部后移一位
14         //*补充一下:所以这也是ArrayList为什么删除元素的时候,只能从后往前删
15         void insert (int i ,Object obj);
16         //将obj添加到集合的末尾
17         void add(Object obj);
18     
19     //删(封装两个方法):一个是在中间删除;一个是遍历集合,删除相对应得
20         //将i位置的元素删除,i后的元素通通前移一位
21         void remove(int i);
22         //从头到尾遍历集合,删除第一个遇到的obj
23         //被删除元素的位置,其后的元素都要前移一位
24         void remove(Object obj);
25         
26     //27         //将i位置上的元素设置为obj(替换)
28         void set(int i,Object obhj);
29         
30     //查(两个方法)注意,查的方法都是有返回值的
31         //获得i位置上的元素--依据索引查元素
32         Object get(int i);
33         //依据元素查索引
34         //在集合中查找obj,没有的话返回-1,有的话返回它的索引
35         int indexOf(Object obj);
36         
37     //清空集合
38         void clear();
39     //判断集合是否为空
40         boolean isEmpty();
41     //获得集合的长度
42         int length();
43     //展示集合中所有的元素(用来做测试)
44         void display();
45 }
  1 /**
  2  * @author Cypher
  3  * @date 2018.09.18
  4  * 这是接口的实现类
  5  * 
  6  * */
  7 
  8 public class myList implements Ilist{
  9     
 10     //集合底层数组:对象数组,用于存放集合中的元素
 11     private Object[] es;
 12     //集合中元素的个数--集合中放了多少元素--集合的长度
 13     private int count;
 14     
 15     //构造方法
 16     //size 集合的容量
 17     public myList(int size){
 18         //这里是,集合中能放多少元素--集合的容量
 19         //es=emptysize
 20         es = new Object[size];
 21     }
 22     
 23     //可以写一个默认的存储数值
 24     //空参构造方法,给集合16个元素的容量
 25     public myList(){
 26         this(16);//→es = new Object[16];
 27     }
 28 
 29     
 30     //最初的版本不进行扩容处理,全部方法写完之后写扩容
 31     @Override
 32     public void insert(int i, Object obj) {
 33         
 34         //集合已满不能再添加元素
 35         if(count==es.length){
 36             throw new RuntimeException("集合已满,不能再添加");
 37         }
 38         //i的合理范围0~count
 39         if(i<0 || i>count){
 40             throw new RuntimeException("索引合理的范围:0~"+count+",实际:"+i);
 41         }
 42         
 43         //将i位置及以后的元素通通后移一位
 44         //如果添加一个数字,必须把最后一位数字先移走,再移倒数第二个,循环,直到空出来需要插入位置
 45         //因为我们需要保护已有的数据
 46         for(int j = count;j>i;j--){
 47             //将前一位的数字赋值到后一位数字上面,就完成了空位的动作
 48             es[j]=es[j-1];
 49         }
 50         
 51         //将obj放到i位置上
 52         es[i] = obj;
 53         count++;//长度+1
 54     }
 55 
 56     //
 57     @Override
 58     public void add(Object obj) {
 59         //判断顺序表是否已满,集合已满就不能再添加元素
 60         if(count==es.length){
 61             //抛出异常
 62             throw new RuntimeException("集合已满,不能再添加");
 63         }
 64         //没有添加之前,最后一个元素的索引count-1
 65         //下一个索引为count
 66         es[count]=obj;
 67         count++;
 68     }
 69 
 70     @Override
 71     public void remove(int i) {
 72         // TODO Auto-generated method stub
 73         
 74     }
 75 
 76     @Override
 77     public void remove(Object obj) {
 78         // TODO Auto-generated method stub
 79         
 80     }
 81 
 82     @Override
 83     public void set(int i, Object obhj) {
 84         // TODO Auto-generated method stub
 85         
 86     }
 87 
 88     @Override
 89     public Object get(int i) {
 90         // TODO Auto-generated method stub
 91         return null;
 92     }
 93 
 94     @Override
 95     public int indexOf(Object obj) {
 96         // TODO Auto-generated method stub
 97         return 0;
 98     }
 99 
100     @Override
101     public void clear() {
102         // TODO Auto-generated method stub
103         
104     }
105 
106     @Override
107     public boolean isEmpty() {
108         // TODO Auto-generated method stub
109         return false;
110     }
111 
112     @Override
113     public int length() {
114         // TODO Auto-generated method stub
115         return 0;
116     }
117 
118     
119     
120     //测试
121     @Override
122     public void display() {
123         for(int i = 0;i<count;i++){
124             System.out.println(es[i]+"\t");
125         }
126     }
127     
128 }
 1 import org.junit.Test;
 2 
 3 
 4 public class TestDemo {
 5     @Test
 6     public void test1(){
 7         System.out.println("helloworld!");
 8     }
 9     
10     @Test
11     public void test2(){
12         myList list = new myList();
13         list.add("java");
14         list.add("c#");
15         list.add("php");
16         list.add("python");
17         list.add("javascript");
18         list.add("sql");
19         list.display();
20     }
21 
22 }
  • 测试类中,引用了一个常用的测试的方法,是junit包下的test方法(使用JUnit4较好)
  • 他可以直接测试而不用写main方法
  • 作业代码没有完成,完成后重新补上
posted on 2018-09-24 22:35  'Cypher  阅读(145)  评论(0)    收藏  举报