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());
    }
}

测试结果:

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

(0)

相关推荐

  • JAVA模拟新增顺序表及单链表

    最近在回顾大学学的数据结构,这里给大家用java模拟顺序表和单链表的新增 1顺序表新增 /** * 顺序表 * * @author cjd * */ public class ArrayList { private Object[] elementData; // 底层是一个数组,目前还没有确定长度 private int size; // 不是数组分配了几个空间,而是元素的个数 public ArrayList() { this(4); } public ArrayList(int initi

  • Java中ArrayList与顺序表的概念与使用实例

    目录 前言 泛型(Generic) 泛型的引入 泛型的基本概念 包装类(Wrapper Class) 包装类的引入 基本数据类型与包装类的对应关系 ArrayList与顺序表 ArrayList简介 ArrayList使用 ArrayList的构造 ArrayList常见方法 ArrayList的遍历 总结 前言 通过前面的博客我们已经大致了解了关于Java的基本知识,而下面的几篇博客我们着重开始对于数据结构的知识进行学习,这篇博客我们就了解关于顺序表和ArrayList的相关知识,从名字上我们

  • java数据结构实现顺序表示例

    复制代码 代码如下: import java.util.Arrays;/** * 顺序线性表的实现 */public class LineList<E>{ private int size;   //长度 private Object[] array;  //底层数组 private final int default_length=16; //默认长度 /**  * 无参构造方法  */ public LineList(){  size = 0;  //使用默认长度构造数组  array =

  • Java数据结构顺序表用法详解

    目录 1.什么是顺序表 2.顺序表的基本功能和结构 3.顺序表基本功能的实现和解析 1.判断线性表是否为空 2.获取指定位置的元素 3.向线性表表添加元素 4.在位置i处插入元素 5.删除指定位置的元素,并返回该元素 6.查找t第一次出现的位置 7.手动扩容方法 1.什么是顺序表 在程序中,经常需要将一组(通常是同为某个类型的)数据元素作为整体管理和使用,需要创建这种元素组,用变量记录它们,传进传出函数等.一组数据中包含的元素个数可能发生变化(可以增加或删除元素). 对于这种需求,最简单的解决方

  • Java顺序表实现图书管理系统

    本文实例为大家分享了Java顺序表实现图书管理系统的具体代码,供大家参考,具体内容如下 一.简介 实现此项目的目的是巩固并理解前面的知识点:类,抽象类,封装,继承,多态,接口等 二.核心需求 管理端   查阅书籍   增加书籍   删除书籍   打印书籍列表   退出系统 用户端   查询书籍   借阅书籍   归还书籍   打印书籍列表   退出系统 三.类的设计 1. 创建图书类 图书类中包含图书的名称,价格,类型,作者和是否被借出等信息,并生成构造方法,Getter()和Setter()方

  • Java 顺序表专题解读

    目录 一 .前言 二.顺序的定义 三.实现顺序表 3.1顺序表的API设计 3.2 顺序表的代码实现 插入示意图 : 3.3完整的API概览: 四.顺序表的测试: 一 .前言 顺序表常用的一种,学习并了解显得十分重要,顺序表为以后的学习打下了基石. 二.顺序的定义 顺序表示在计算机内存中以数组的形式保存的线性表,在内存中占用一组连续的存储 单元,在此中依次存储各个元素. 三.实现顺序表 3.1顺序表的API设计 3.2 顺序表的代码实现 定义一个泛型类(泛型类的好处就是可以接受任意类型) //定

  • Java实现一个顺序表的完整代码

    实现一个顺序表 接口实现 定义一个MyArrayList类,在类中实现以下函数 public class MyArrayList { } 数组的定义 public int[] elem;//定义一个整形数组 public int usize;//usize表示数组的长度 public MyArrayList(){ this.elem = new int[5]; } 打印顺序表 for循环打印顺序表的每一位 public void display(){ for (int i = 0; i < th

  • Java数据结构之顺序表和链表精解

    目录 前言 1. 顺序表 代码实现 2. 链表 链表图解 代码实现 前言 两个数据结构:顺序表和链表 数据结构是一门学科,和语言无关. 数据 + 结构:一种描述和组织数据的方式. 1. 顺序表 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储.在数组上完成数据的增删查改.其逻辑上和物理上都是连续的. 问题引入:一个数组放在这,我们如何才能自己不去数,让程序自己进行计数? 答:在引入变量,每次放一个元素就更新一次.(如下图,为问题的示意) 也就是说顺序表的底层

  • Java数据结构之顺序表篇

    目录 一.线性表 二.顺序表 1.概念及结构 2.顺序表的实现 打印顺序表 获取顺序表的有效长度 在pos位置新增元素 判断是否包含某个元素 查找某个元素对应的位置 获取/查找pos位置的元素 给pos位置的元素设为value 删除第一次出现的关键字key 清空顺序表 3.顺序表的优.缺点 三.顺序表的实现代码汇总 一.线性表 线性表( linear list ) 是 n 个具有相同特性的数据元素的有限序列. 线性表是一种在实际中广泛使用的数据结构,常见 的线性表:顺序表.链表.栈.队列.字符串

  • Java实现顺序表的增删查改功能

    创建顺序表 在java语言中要实现顺序表,首先创建一个类,因为顺序表本身就像数组,所以我们这里定义一个int类型的数组和usedata为有效数据,构造方法里先申请可以存放10个数据的空间. public class MyArraylist1 { public int[] elem;//存储数据的有效个数 public int usedata;//有效数据的个数 //构造方法 public MyArraylist1() { this.elem = new int[10]; } 主要实现以下方法 p

随机推荐