Java实现顺序表的操作

 更新时间:2022年01月21日 08:17:20   作者:Sasura_321  
这篇文章主要为大家详细介绍了Java实现顺序表的基本操作,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Java实现顺序表的基本操作,供大家参考,具体内容如下

静态顺序表:使用定长数组存储。
动态顺序表:使用动态开辟的数组存储。

接口

package com.github.sqlist;

public interface ISequence {
    // 在 pos 位置插入 val
    boolean add(int pos, Object data);

    // 查找关键字 key 找到返回 key 的下表,没有返回 -1
    int search(Object key);

    // 查找是否包含关键字 key 是否在顺序表当中(这个和search有点冲突)
    boolean contains(Object key);

    // 得到 pos 位置的值
    Object getPos(int pos);

    // 删除第一次出现的关键字 key
    Object remove(Object key);

    // 得到顺序表的长度
    int size();

    // 打印顺序表
    void display();

    // 清空顺序表以防内存泄漏
    void clear();
}

实现接口里的每个方法

package com.github.sqlist;

import java.util.Arrays;

/*
 * 顺序表
 */
public class MySequenceImpl implements ISequence {

    private Object[] elem;
    // 有效数据个数
    private int usedSize;
    private static final int DEFAULT_SIZE = 10;

    public SqList() {
        this.elem = new Object[DEFAULT_SIZE];
        this.usedSize = 0;
    }

    /**
     * 判断是否为满
     * @return 满了返回true,否则返回false
     */
    private boolean isFull() {
        return this.elem.length == this.usedSize;
    }

    /**
     * 在 pos 位置插入 val
     * @param pos
     *        要插入的位置
     * @param data
     *        要插入的值
     * @return
     *        插入成功返回true,否则返回false
     */
    @Override
    public boolean add(int pos, Object data) {
        // 1. 判断pos位置的合法性
        if (pos < 0 || pos > this.elem.length) {
            return false;
        }

        // 2. 判断是否满了,如果满了进行扩容
        if (isFull()) {
            this.elem = Arrays.copyOf(this.elem, 2*this.elem.length);
        }

        // 3. 把pos位置以及之后的数全部向后挪一个位置
        for (int i = this.usedSize-1; i >= pos; i--) {
            this.elem[i+1] = this.elem[i];
        }

        // 4. 在 pos 位置插入 val
        this.elem[pos] = data;

        // 5. 更新长度
        this.usedSize++;

        return true;
    }

    /**
     * 判断是否为空
     * @return 表为空返回true,否则返回false
     */
    private boolean isEmpty() {
        return this.usedSize == 0;
    }

    /**
     * 查找关键字 key 找到返回 key 的下表,没有返回 -1
     * @param key 关键字的值
     * @return 查找成功返回true,失败返回false
     */
    @Override
    public int search(Object key) {
        // 1. 判断是否为空
        if (isEmpty()) {
            return -1;
        }

        // 2. 遍历查找
        for (int i = 0; i < this.elem.length; i++) {
            // 注意:判断条件不能写成:this.elem[i] == key
            if (this.elem[i].equals(key)) {
                return i;
            }
        }
        return -1;
    }

    /**
     * 查找是否包含关键字 key 是否在顺序表当中(这个和search有点冲突)
     * @param key 关键字的值
     * @return 查找成功返回true,失败返回false
     */
    @Override
    public boolean contains(Object key) {
        // 1. 判断是否为空
        if (isEmpty()) {
            return false;
        }

        // 2. 遍历查找
        for (int i = 0; i < this.elem.length; i++) {
            // 注意:判断条件不能写成:this.elem[i] == key
            if (this.elem[i].equals(key)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 得到 pos 位置的值
     * @param pos 得到的值的位置
     * @return 成功得到 pos位置的值返回true,否则返回false
     */
    @Override
    public Object getPos(int pos) {
        // 1. 判断位置是否合法
        if (pos<0 || pos>=this.elem.length) {
            return null;
        }

        // 2. 位置合法
        return this.elem[pos];
    }

    /**
     * 删除第一次出现的关键字 key
     * @param key 关键字
     * @return
     */
    @Override
    public Object remove(Object key) {
        // 1. 先查表看有没有这个关键字
        // index:关键字下标
        int index = search(key);

        // 2. 若表里没有这个关键字
        if (index == -1) {
            return null;
        }

        // 3. 表里有这个关键字
        Object data = this.elem[index];
        int i;
        // 删除第一次出现的关键字 key,把key后面的数全部向前挪一个位置
        for (i = index; i < this.usedSize; i++) {
            elem[i] = elem[i+1];
        }
        this.usedSize--;
        this.elem[i+1] = null;
        return data;
    }

    /**
     * 得到顺序表的长度
     * @return 顺序表的长度
     */
    @Override
    public int size() {
        return this.usedSize;
    }

    /**
     * 打印顺序表
     */
    @Override
    public void display() {
        for (int i = 0; i < this.usedSize; i++) {
            System.out.print(this.elem[i] + " ");
        }
        System.out.println();
    }

    /**
     * 清空顺序表以防内存泄漏
     */
    @Override
    public void clear() {
        for (int i = 0; i < this.usedSize; i++) {
            this.elem[i] = null;
        }
    }
}

测试方法的正确性

package com.github.sqlist;


public class TestDemo1 {
    public static void main(String[] args) {
        MySequenceImpl mySequence = new MySequenceImpl();

        for (int i = 0; i < 10; i++) {
            mySequence.add(i,i);
        }
        System.out.println("在最大值10的范围内插入数据:");
        mySequence.display();
        System.out.println();

        for (int i = 10; i < 20; i++) {
            mySequence.add(i,i);
        }
        System.out.println("扩容:");
        mySequence.display();
        System.out.println();

        System.out.println("随机位置插入数据:");
        mySequence.add(9,"list");
        mySequence.display();
        System.out.println();

        System.out.println("search查找一个数据:"+mySequence.search("list"));
        System.out.println("contains查找一个数据:"+mySequence.contains("list"));
        System.out.println();

        System.out.println("查找某一个位置对应的值:"+mySequence.getPos(9));
        System.out.println();

        System.out.println("删除一个数据:"+mySequence.remove(8));
        mySequence.display();
        System.out.println();

        System.out.println("得到顺序表的长度:"+mySequence.size());
    }
}

测试结果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java多线程run方法中直接调用service业务类应注意的问题及解决

    Java多线程run方法中直接调用service业务类应注意的问题及解决

    这篇文章主要介绍了Java多线程run方法中直接调用service业务类应注意的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Spring利用注解整合Mybatis的方法详解

    Spring利用注解整合Mybatis的方法详解

    这篇文章主要为大家介绍了Spring如何利用注解整合MyBatis,文中的示例代码讲解详细,对我们学习有一定的参考价值,需要的小伙伴可以参考一下
    2022-06-06
  • J2EE Servlet基础在浏览器上运行HelloServlet的方法

    J2EE Servlet基础在浏览器上运行HelloServlet的方法

    这篇文章主要介绍了J2EE Servlet基础在浏览器上运行HelloServlet的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • Java BeanUtils工具类常用方法讲解

    Java BeanUtils工具类常用方法讲解

    这篇文章主要介绍了Java BeanUtils工具类常用方法讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • RestTemplate发送请求时Cookie的影响及注意事项说明

    RestTemplate发送请求时Cookie的影响及注意事项说明

    这篇文章主要介绍了RestTemplate发送请求时Cookie的影响及注意事项说明,具有很好的参考价值,希望对大家有所帮助。
    2023-07-07
  • idea企业开发之新建各类型项目的详细教程

    idea企业开发之新建各类型项目的详细教程

    这篇文章主要介绍了idea企业开发之新建各类型项目的详细教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • Java中的LinkedList集合详解

    Java中的LinkedList集合详解

    这篇文章主要介绍了Java中的LinkedList集合详解,  LinkedList 是一个双向链表结构(JDK1.6 之前为循环链表,JDK1.7 取消了循环),在任意位置插入删除都很方便,但是不支持随机取值,每次都只能从一端开始遍历,直到找到查询的对象,然后返回,需要的朋友可以参考下
    2023-09-09
  • springboot jackson自定义序列化和反序列化实例

    springboot jackson自定义序列化和反序列化实例

    这篇文章主要介绍了spring boot jackson自定义序列化和反序列化实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • @CacheEvict 清除多个key的实现方式

    @CacheEvict 清除多个key的实现方式

    这篇文章主要介绍了@CacheEvict 清除多个key的实现方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • Java设计模式之抽象工厂模式

    Java设计模式之抽象工厂模式

    这篇文章主要为大家详细介绍了Java设计模式之抽象工厂模式的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03

最新评论