数据结构之顺序表

    技术2022-07-11  74

    在网上学了数据结构时,碰到点问题,也顺便记录一下。 自己跟着写了一个顺序表(低版本的ArrayList)。 **第一个问题,**为什么有了ArrayList这么好的顺序表了,我们还要单独去实现呢??? 1,ArrayList有通用性,但是在碰到特性的时候可能失去了他的优势。 2,ArrayList有大篇幅用不到方法,不如我们自己写的简便,浪费资源。 第二个问题

    import java.util.Iterator; public class SquenceList<T> implements Iterable<T> { //存储元素的数组 private T[] eles; //当前线性表的长度 private int N; public SquenceList(int capacity) { //初始化数组 eles = (T[]) new Object[capacity]; //初始化长度(为什么我们初始化这两个呢,因为我们的成员变量是这两个) this.N = 0; } //空置线性表 public void clear() { this.N = 0; } public void printeles(){ for (int i = 0; i < eles.length; i++) { System.out.println(eles[i]); } } //向线性表中添加一个元素t public void insert(T t) { eles[N++] = t; } //获取线性表中元素的个数 public int length() { return N; } //读取并返回线性表中的第i个元素的值 public T get(int i) { return eles[i]; } //判断线性表是否为空,是返回true,否返回false public boolean isEmpty() { return N == 0; } //在线性表的第i个元素之前插入一个值为t的数据元素。 public void insert(int i, T t) { for (int j = N; j >= i + 1; j--) { eles[j] = eles[j - 1]; } eles[i] = t; N++; } //返回线性表中首次出现的指定的数据元素的位序号,若不存在,则返回-1。 public int indexOf(T t) { for (int i = 0; i < N; i++) { if (eles[i].equals(t)) { return i; } } return -1; } //删除并返回线性表中第i个数据元素。 public T remove(int i) { T t = eles[i]; for (int j = i; j < N - 1; j++) { eles[j] = eles[j + 1]; } N--; return t; } //根据参数newSize,重置eles的大小 public void resize(int newSize){ //定义一个临时数组,指向原数组 T[] temp=eles; //创建新数组 eles=(T[])new Object[newSize]; //把原数组的数据拷贝到新数组即可 for(int i=0;i<N;i++){ eles[i]=temp[i]; } } @Override public Iterator<T> iterator() { return new SIterator(); } private class SIterator implements Iterator{ private int cusor; public SIterator(){ this.cusor=0; } @Override public boolean hasNext() { return cusor<N; } @Override public Object next() { return eles[cusor++]; } } } public class TestSquenceList { public static void main(String[] args) { SquenceList <String> list=new SquenceList<>(10); list.insert("1"); list.insert("2"); list.insert("3"); list.clear(); for (int i = 0; i <list.length(); i++) { System.out.println(list.get(i)); } System.out.println(list.get(1)); } }

    我很质疑网上老师写的clear()方法,因为他this.N=0; 只重置了N,并没有对数组进行任何操作,并没有把数组变为空数组。 所以我们外部调用的时候,用for循环时,用到了.length,所以会什么都打印不出来。但是我们单独用这个get方法,一定会打印出来东西的。 等我们再向其添加数据时,会覆盖原来的数据。 第三个问题: 一般作为容器存储数据,都需要向外部提供遍历的方式,因此我们需要给顺序表提供遍历方式。 需要做如下操作: 1.让SequenceList实现Iterable接口,重写iterator方法; 2.在SequenceList内部提供一个内部类SIterator,实现Iterator接口,重写hasNext方法和next方法;

    我错把实现的接口Iterable打成Iterator(让你实现hasNext方法和next方法)是不对的,应该重写iterator方法;

    Processed: 0.014, SQL: 12