一、前言
21天学习打卡的第二周,本文主要是针对上文提到的顺序表的代码进行优化
二、概述
一般作为容器存储数据,都需要向外部提供遍历的方式,因此我们需要给顺序表提供遍历方式,而在Java中,遍历集合的方式一般都是用的是foreach循环
三、解题思路
1.让SequenceList实现Iterable接口,重写iterator方法
2.在SequenceList内部提供一个内部类SIterator实,现Iterator接口,重写hasNext方法和next方法
四、重写方法
@Override public Iterator iterator(){ return new SIterator(); } private class SIterator implements Iterator{ private int cur; public SIterator(){ this.cur = 0; } @Override public boolean hasNext(){ return cur < N; } @Override public T next(){ return eles[cur++]; } }
五、完整代码
public class SequenceList2<T> implements Iterable<T>{ private T[] eles; private int N; //构造方法 public SequenceList2(int capacity){ eles = (T[])new Object[capacity]; N = 0; } //将一个线性表置为空表 public void clear(){ N = 0; } //判断当前线性表是否为空表 public boolean isEmpty(){ return N == 0; } //获取线性表的长度 public int length(){ return N; } //获取当前索引对应元素 public T get(int i){ if(i < 0 || i >= N){ throw new RuntimeException("当前元素不存在"); } return eles[i]; } //向线性表中索引值为i处添加元素t public void insert(int i, T t){ if(i == eles.length){ throw new RuntimeException("当前表已满,无法插入元素"); } if(i < 0 || i > N){ throw new RuntimeException("插入的位置不合法"); } //将索引值为i及其以后的元素依次向后移动,空出索引值为i的位置 for(int index = N; index > i; index--){ eles[index] = eles[index - 1]; } eles[i] = t;//将t元素放在索引值为i的位置上 N++;//修改顺序表长度 } //向线性表中添加元素t public void insert(T t){ if(N == eles.length){ throw new RuntimeException("当前表已满,无法添加元素"); } eles[N++] = t; } //删除i处元素值,并返回该元素 public T remove(int i){ //判断要删除的元素是否在顺序表内 if(i < 0 || i > N){ throw new RuntimeException("删除元素不存在"); } //记录i处元素值 T result = eles[i]; //将元素顺序向后移位 for(int index = i; index < N-1; index++){ eles[index] = eles[index+1]; } N--;//改变线性表长度 return result;//返回当前元素值 } //查找t元素第一次出现位置 public int indexOf(T t){ if(t == null){ throw new RuntimeException("查找的元素不合法"); } for(int i = 0; i < N; i++){ if(eles[i].equals(t)){ return i; } } return -1; } public void showEles(){ for (int i = 0; i < N ; i++) { System.out.println(eles[i] + " "); } System.out.println(); } @Override public Iterator iterator(){ return new SIterator(); } private class SIterator implements Iterator{ private int cur; public SIterator(){ this.cur = 0; } @Override public boolean hasNext(){ return cur < N; } @Override public T next(){ return eles[cur++]; } } }
六、结语
本文需要有一定Java基础才能重写方法