算法——顺序表(2)

简介: 一般作为容器存储数据,都需要向外部提供遍历的方式,因此我们需要给顺序表提供遍历方式,而在Java中,遍历集合的方式一般都是用的是foreach循环

一、前言


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基础才能重写方法

相关文章
|
2月前
|
算法
顺序表应用4:元素位置互换之逆置算法
顺序表应用4:元素位置互换之逆置算法
|
9月前
|
存储 算法
数据结构与算法之顺序表详解
数据结构与算法之顺序表详解
28 0
|
10月前
|
算法 C语言
实现顺序表的各种基本算法
C语言顺序表实现
96 0
|
25天前
|
存储 缓存 算法
数据结构和算法学习记录——总结顺序表和链表(双向带头循环链表)的优缺点、CPU高速缓存命中率
数据结构和算法学习记录——总结顺序表和链表(双向带头循环链表)的优缺点、CPU高速缓存命中率
19 0
|
17天前
|
存储 机器学习/深度学习 算法
【数据结构与算法】:手搓顺序表(Python篇)
【数据结构与算法】:手搓顺序表(Python篇)
|
17天前
|
存储 算法 C++
【数据结构与算法】:带你手搓顺序表(C/C++篇)
【数据结构与算法】:带你手搓顺序表(C/C++篇)
|
7天前
|
存储 算法
【C/数据结构与算法】:顺序表的实现
【C/数据结构与算法】:顺序表的实现
13 0
|
25天前
|
算法
数据结构和算法学习记录——复习静态顺序表的两个接口函数(在指定位置插入数据,在指定位置删除数据)
数据结构和算法学习记录——复习静态顺序表的两个接口函数(在指定位置插入数据,在指定位置删除数据)
11 0
|
25天前
|
存储 算法
数据结构和算法学习记录——线性表之单链表(上)-初始单链表及其尾插函数(顺序表缺陷、单链表优点、链表打印)
数据结构和算法学习记录——线性表之单链表(上)-初始单链表及其尾插函数(顺序表缺陷、单链表优点、链表打印)
16 0
|
25天前
|
存储 算法
数据结构和算法学习记录——线性表之顺序表(顺序表概念、结构、顺序表接口函数-头插头删、尾插尾删)
数据结构和算法学习记录——线性表之顺序表(顺序表概念、结构、顺序表接口函数-头插头删、尾插尾删)
11 0