1,引入了JAVA泛型类,因此定义了一个Object[] 类型的数组,从而可以保存各种不同类型的对象。

2,默认构造方法创建了一个默认大小为16的Object数组;带参数的构造方法创建一个指定长度的Object数组

3,实现的顺序表的基本操作有:返回表的长度、获取指定索引处的元素(注意是索引,而不是位置。索引以下标0开始,位置以下标1开始)、按值查找数据元素的位置、直接插入元素(顺序表尾部)、向指定位置插入元素、直接删除元素(在顺序表尾部)、删除指定索引处元素、判断表是否为空、清空表。

4,在Java类库中,java.util.ArrayList 类 实现了顺序表,因此可以直接使用JAVA类库中的ArrayList来完成顺序表的各种操作。以下为实现顺序表的具体代码:

 import java.util.Arrays;

 public class SequenceList<T> {
private final int DEFAULT_SIZE = 16;//final实例变量显示指定初始值,且不再变化。 private Object[] elementData;//该数组用来保存顺序表中的元素
private int capacity;//保存数组的长度
private int size;//保存顺序表中当前元素的个数 //以默认的大小创建顺序表
public SequenceList(){
capacity = DEFAULT_SIZE;
elementData = new Object[capacity];
} //以指定的大小创建顺序表
public SequenceList(int initSize){
capacity = 1;
while(capacity < initSize)
capacity <<= 1;//将capacity设置成大于initSize的最小2次方
elementData = new Object[capacity];
} //获取顺序表中当前元素的个数
public int length(){
return size;
} //获取顺序表中索引为 i 处的元素,i表示索引,即以 0 开始
public T get(int i){
if(i < 0 || i > size - 1)
throw new IndexOutOfBoundsException("顺序表索引越界");
return (T)elementData[i];
} //查看顺序表中指定元素的索引,若未找到,返回-1
public int locate(T element){
for(int i = 0; i < size; i++)
if(elementData[i].equals(element))
return i;
return -1;
} //在顺序表的指定索引处插入一个元素
public void insert(T element, int index){
if(index < 0 || index > size)
throw new IndexOutOfBoundsException("顺序表索引越界");
ensureCapacity(size + 1);//确保顺序表满时进行扩容,从而能插入元素
//将指定索引后的所有元素向后移动一个位置
// System.arraycopy(elementData, index, elementData, index + 1, size - index);
for(int i = size; i > index; i--)
elementData[i] = elementData[i - 1];
elementData[index] = element;
size++;//顺序表中的元素个数增1
} private void ensureCapacity(int minCapacity){
//当数组容量已满时,对数组进行扩容。将容量扩展到大于minCapacity的最小2的次方
if(minCapacity > capacity){
while(capacity < minCapacity)
capacity <<= 1;
elementData = Arrays.copyOf(elementData, capacity);
}
} //在顺序表的末尾添加一个元素
public void add(T element){
insert(element, size);
} //删除顺序表中指定索引处的元素
public T delete(int index){
if(index < 0 || index > size - 1)
throw new IndexOutOfBoundsException("顺序表索引越界");
T oldValue = (T)elementData[index];
int numMoved = size - index - 1;//计算需要移动的元素个数
if(numMoved > 0){
System.arraycopy(elementData, index + 1, elementData, index, numMoved);
}
elementData[--size] = null;//让垃圾回收器及时回收,避免内存泄露
return oldValue;
} //删除顺序表中的最后一个元素
public T remove(){
return delete(size - 1);
} //判断顺序表是否为空表
public boolean empty(){
return size == 0;
} //清空顺序表
public void clear(){
Arrays.fill(elementData, null);//将数组elementData中的每个元素都赋值null
size = 0;
} public String toString(){
if(size == 0)
return "[]";
else{
StringBuilder sb = new StringBuilder("[");
for(int i = 0; i < size; i++)
sb.append(elementData[i].toString() + ", ");
int len = sb.length();
//删除由于上面for循环中最后添加的多余的两个字符 (一个是逗号,一个是空格符号)
return sb.delete(len - 2, len).append("]").toString();
}
}
}

使用JAVA数组实现顺序表的更多相关文章

  1. "《算法导论》之‘线性表’":基于动态分配的数组的顺序表

    我们利用静态分配的数组来实现的顺序表的局限还是挺大的,主要在于它的容量是预先定好的,用户不能根据自己的需要来改变.如果为了后续用户能够自己调整顺序表的大小,动态地分配数组空间还是很有必要的.基于动态分 ...

  2. "《算法导论》之‘线性表’":基于静态分配的数组的顺序表

    首先,我们来搞明白几个概念吧(参考自网站数据结构及百度百科). 线性表 线性表是最基本.最简单.也是最常用的一种数据结构.线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外, ...

  3. C++利用动态数组实现顺序表(不限数据类型)

    通过类模板实现顺序表时,若进行比较和遍历操作,模板元素可以通过STL中的equal_to仿函数实现,或者通过回调函数实现.若进行复制操作,可以采用STL的算法函数,也可以通过操作地址实现.关于回调函数 ...

  4. 使用JAVA数组实现顺序栈

    1,首先总结一下线性表(分为顺序表和链接表,[即顺序存储结构和链式存储结构的区别])和栈(顺序栈和链接栈)还有队列(顺序队列和链接队列)的JAVA类库中的实现: java.util.ArrayList ...

  5. Java数据结构-01顺序表

    一.定义 线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列. 二.存储分类 1.顺序存储: ①简述:是指将线性表中的各个元素依次存放在一组地址连续的存储单元中,通常将这种方 ...

  6. Java——数据结构(顺序表)

    这是一个顺序表的类,初始化的时候就已经确定了表的长度,之后不能添加数据,因为使用的是数组存储的数据,不过这个表的类型是泛型的. public class List { private Object[] ...

  7. C语言利用动态数组实现顺序表(不限数据类型)

    实现任意数据类型的顺序表的初始化,插入,删除(按值删除:按位置删除),销毁功能.. 顺序表结构体 实现顺序表结构体的三个要素:(1)数组首地址:(2)数组的大小:(3)当前数组元素的个数. //顺序表 ...

  8. java语言建立顺序表

    package datastructure; //线性表 public interface IList { public void clear(); public boolean isEmpty(); ...

  9. Java实现顺序表

    利用顺序存储结构表示的顺序表称为顺序表. 它用一组连续的地址存储单元一次存放线性表中的数据元素. 顺序表的实现是数据结构中最简单的一种. 由于代码中已经有详细注释,代码外不再阐述. 下次再陈上关于顺序 ...

随机推荐

  1. rt-thread之rt_kprintf函数输出串口设备更改

    @2019-01-30 [小记] 一般 rt-thread 发布的 bsp 库默认的 rt_kprintf 函数的输出设备是串口1,想要更改输出设备为串口1,以 stm32 为例步骤如下: 首先,打开 ...

  2. Gym - 100989F

    You must have heard about Agent Mahone! Dr. Ibrahim hired him to catch the cheaters in the Algorithm ...

  3. javascript之判断专题

    javascript有数组,对象,函数,字符串,布尔,还有Symbol,set,map,weakset,weakmap. 判断这些东西也是有很多坑,像原生的typeof,instanceOf有一些bu ...

  4. js常用的正则表达式

    一.校验数字的表达式 数字:^[0-9]*$ n位的数字:^\d{n}$ 至少n位的数字:^\d{n,}$ m-n位的数字:^\d{m,n}$ 零和非零开头的数字:^(0|[1-9][0-9]*)$ ...

  5. A1141. PAT Ranking of Institutions

    After each PAT, the PAT Center will announce the ranking of institutions based on their students' pe ...

  6. java面试——问题回溯

    背景:用来记录面试过程中遇到的问题,在这里进行记录,下次不要犯同样的错误. 迪普科技 Linux服务器下的top命令 #动态更新的虚拟文件实际上是许多其他内存相关工具(如:free / ps / to ...

  7. 斯坦福大学公开课机器学习: machine learning system design | prioritizing what to work on : spam classification example(设计复杂机器学习系统的主要问题及构建复杂的机器学习系统的建议)

    当我们在进行机器学习时着重要考虑什么问题.以垃圾邮件分类为例子.假如你想建立一个垃圾邮件分类器,看这些垃圾邮件与非垃圾邮件的例子.左边这封邮件想向你推销东西.注意这封垃圾邮件有意的拼错一些单词,就像M ...

  8. 第五节,Neural Networks and Deep Learning 一书小节(中)

    在这一节,我们对上一个程序(Network1.py)进行了优化 3.改进神经网络的学习方法 (1)交叉熵代价函数的引入 Network1程序采用了S型神经元,S型神经元存在一个问题,当输出层神经元的输 ...

  9. python zip()函数的使用

    解释: 后缀为zip的文件肯定都见过吧?zip是打包压缩好的一个文件,所以,zip()函数也简单的理解为打包压缩函数,将不同个数相同类型的字段结合在一起. 官方定义为:zip() 函数用于将可迭代的对 ...

  10. 安装SVN并使用IDEA检出项目

    首先去下载小王八:https://tortoisesvn.net/downloads.html 下载完毕,打开 .. ..注意勾选command line工具 .. .. 下一步,打开IDEA,配置S ...