[Java算法分析与设计]--线性结构与顺序表(List)的实现应用
说到线性结构,我们应该立马能够在脑子里蹦出“Array数组”这个词。在Java当中,数组和对象区别基本数据类型存放在堆当中。它是一连串同类型数据存放的一个整体。通常我们定义的方式为:
Object[] objs = new Object[n] //n为数组大小
而顺序表的底层便是数组。在Java当中顺序表比较常用的有:ArrayList、Vector等。下面我们通过代码实现我们自己的SequenceList。
首先定义List接口:
package com.chen.arithmetic_test.list_test; /**
* Created by ChenMP on 2017/7/3.
*/
public interface List {
//获得长度
public int size();
//插入元素
public boolean insert(int index, Object o) throws Exception;
//新增元素
public boolean add(Object o) throws Exception;
//删除元素
public boolean remove(int index) throws Exception;
//获取元素
public Object get(int index) throws Exception;
//判断线性表是否为空
public boolean isEmpty();
}
定义SequenceList实现类:
package com.chen.arithmetic_test.list_test; /**
* Created by ChenMP on 2017/7/3.
*/
public class SequenceList implements List {
private Object[] listArray;//对象数组
private int size;//对象数组长度
private boolean isFixed;//是否限定对象数组长度 public SequenceList() {
this.size = 0;
this.listArray = new Object[3];//默认对象数组固定长度为3
this.isFixed = false;//不限定对象数组长度
} public SequenceList(int length) {
this.listArray = new Object[length];
this.size = 0;
this.isFixed = true;//限定对象数组长度
} @Override
public int size() { return size;
} @Override
public boolean insert(int index, Object o) throws Exception {
if(index > size || index < 0) //index不合法
throw new Exception("IndexOutOfBoundsException"); if(index==size && size==this.listArray.length && this.isFixed) //下标超过边界,且限定对象数组长度
throw new Exception("IndexOutOfBoundsException"); if(index==size && size==this.listArray.length && !this.isFixed) {//下标超过边界,且不限定对象数组长度
Object[] newListArray = new Object[this.listArray.length + 10];
System.arraycopy(listArray, 0, newListArray, 0, listArray.length);
newListArray[index] = o;
this.listArray = newListArray;
this.size++;
return true;
} if (index == size && size<this.listArray.length) {
listArray[index] = o;
this.size++;
return true;
} if(index < size && index >= 0) {
listArray[index] = o;
return true;
} return false;
} @Override
public boolean add(Object o) throws Exception {
if(this.size==this.listArray.length && this.isFixed)
throw new Exception("IndexOutOfBoundsException"); if(this.size==this.listArray.length && !this.isFixed) {
Object[] newListArray = new Object[this.listArray.length + 10];
System.arraycopy(listArray, 0, newListArray, 0, listArray.length);
newListArray[size] = o;
this.listArray = newListArray;
this.size++;
return true;
} if(this.size<this.listArray.length) {
listArray[this.size] = o;
this.size++;
return true;
}
return false;
} @Override
public boolean remove(int index) throws Exception {
if(index < 0 || index >= size)
throw new Exception("IndexOutOfBoundsException"); System.arraycopy(listArray, 0, listArray, index, listArray.length-index);
this.size--;
return true;
} @Override
public Object get(int index) throws Exception {
if(index < 0 || index >= size)
throw new Exception("IndexOutOfBoundsException");
return this.listArray[index];
} @Override
public boolean isEmpty() {
return this.size>0?false:true;
} @Override
public String toString() { //返回List内容信息
StringBuilder sb = new StringBuilder();
for (Object o : this.listArray) {
if(null != o)
sb.append(o).append(" ,");
}
return sb.toString();
}
}
下面是我们的测试代码:
package com.chen.arithmetic_test.list_test; /**
* Created by ChenMP on 2017/7/3.
*/
public class TestList { public static void main(String[] args) throws Exception {
List list = new SequenceList(3);
list.insert(0,0);
list.add(1);
list.add(2);
// list.add(3);
System.out.print("测试定长list: " + list.toString() + "|| list长度为: " + list.size()); System.out.println();
List list2 = new SequenceList();
list2.add(0);
list2.add(1);
list2.add(2);
list2.add(3);
System.out.print("测试不定长list: " + list2.toString() + "|| list长度为: " + list2.size());
}
}
在java中顺序表的实现原理基本也是类似的,理解了它的原理再看JDK源码自然也就很容易理解了。
[Java算法分析与设计]--线性结构与顺序表(List)的实现应用的更多相关文章
- [C++]线性链表之顺序表<一>
顺序表中数据元素的存储地址是其序号的线性函数,只要确定了存储顺序表的起始地址(即 基地址),计算任意一个元素的存储地址的时间是相等的,具有这一特点的存储结构称为[随机存储]. 使用的基本数据结构:数组 ...
- [C++]线性链表之顺序表<二>
/* @content 线性链表之顺序表 @date 2017-3-21 1:06 @author Johnny Zen */ /* 线性表 顺序表 链式表[带头指针/不 ...
- [Java算法分析与设计]--单向链表(List)的实现和应用
单向链表与顺序表的区别在于单向链表的底层数据结构是节点块,而顺序表的底层数据结构是数组.节点块中除了保存该节点对应的数据之外,还保存这下一个节点的对象地址.这样整个结构就像一条链子,称之为" ...
- 线性表的顺序存储结构之顺序表类的实现_Java
在上一篇博文——线性表接口的实现_Java中,我们实现了线性表的接口,今天让我们来实现线性表的顺序存储结构——顺序表类. 首先让我们来看下顺序表的定义: 线性表的顺序存储是用一组连续的内存单元依次存放 ...
- Java数据结构介绍(线性结构和非线性结构)
数据结构包括:线性结构和非线性结构. 线性结构 数据元素之间存在一对一的线性关系 包括顺序存储结构和链式存储结构.顺序存储的线性表称为顺序表,顺序表中的存储元素是连续的 链式存储的线性表称为链表,链表 ...
- [Java算法分析与设计]--顺序栈的实现
在程序的世界,栈的应用是相当广泛的.其后进先出的特性,我们可以应用到诸如计算.遍历.代码格式校对等各个方面.但是你知道栈的底层是怎么实现的吗?现在跟随本篇文章我们来一睹它的庐山真面目吧. 首先我们先定 ...
- [Java算法分析与设计]--链式堆栈的设计
在上篇文章当中,我们实现了底层为数组的顺序栈.在我之前的文章中也提到过:以数组为数据结构基础在存储数据方面需要一整块连续的内存来存放数据,一旦遇到需要可以动态扩展的功能需求时如果数据量大可能会给虚拟机 ...
- 数据结构学习java(一点五)链式顺序表(链表)
java中没有将指针暴露给用户(以前做过看过一篇文章写有java中是有指针的,只是被藏起来了),所以得使用引用的方式. 何为引用请看下面这篇文章(写的很不错,当然肯定比我写的好): https://w ...
- C语言实现的顺序表
顺序表是用一段地址连续的存储单元依次存储数据元素的线性结构.顺序表可分为静态存储和动态存储,静态顺序表比较简单,数据空间固定,而动态顺序表可以动态增容,便于存放大量数据,现主要把动态的基本实现一下~此 ...
随机推荐
- java的map
Map是一种把键对象和值对象进行关联的容器,而一个值对象又可以是一个Map,依次类推,这样就可形成一个多级映射. 这里有详细的论述http://www.oracle.com/technetwork/c ...
- Linux的文件系统及其硬盘分区挂载原理
如果您是一位新手,也许 您还不知道如何把文件从Windows拷贝到Linux上吧?下面,我们将说明Unix文件系统以及mount的工作过程,然后再比较详细地讨论. mount的使用和有关选项.如果您已 ...
- 【面试必备】Swift 面试题及其答案
原文:Swift Interview Questions and Answers 原作者:Antonio Bello 原作者介绍: Antonio 拥有丰富的编程经验.他开始编程的时候,内存单位还是 ...
- 《java入门第一季》之Character类小案例
/* * Character 类在对象中包装一个基本类型 char 的值 * 此外,该类提供了几种方法,以确定字符的类别小写字母,数字,等等,并将字符从大写转换成小写,反之亦然 * */ 下面通 ...
- HashMap与HashTable面试宝典
u012233832的专栏 初生牛犊 目录视图 摘要视图 订阅 写博客,送money.送书.送C币啦 7-8月博乐推荐文章 砸BUG 得大奖 100%中奖率 微信开发学习路线高级篇上线 ...
- 预装WIN8的电脑是GPT分区模式,无法安装WIN7
本人的笔记本自带的是WIN8系统,现在想安装WIN7的系统,但是安装不了,提示"windows无法安装到这个磁盘.选中的磁盘采用GPT分区形式". 通过上网搜索得知WIN7一般安装 ...
- 解决ADT大量出现"Unexpected value from nativeGetEnabledTags: 0"的问题
在过滤器中输入下面的代码即可:(此方法搜索于网略) ^(?!.*(nativeGetEnabledTags)).*$
- 【Visual C++】游戏编程学习笔记之一:五毛钱特效之透明和半透明处理
本系列文章由@二货梦想家张程 所写,转载请注明出处. 本文章链接:http://blog.csdn.net/terence1212/article/details/44163799 作者:ZeeCod ...
- OpenCV实现图像物体轮廓,前景背景,标记,并保存。
#include <iostream> // for standard I/O #include <string> // for strings #include <io ...
- C# 视频多人脸识别
上一篇内容的调整,并按 @轮回 的说法,提交到git了,https://github.com/catzhou2002/ArcFaceDemo 基本思路如下: 一.识别线程 1.获取当前图片 2.识别当 ...