[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语言实现的顺序表
顺序表是用一段地址连续的存储单元依次存储数据元素的线性结构.顺序表可分为静态存储和动态存储,静态顺序表比较简单,数据空间固定,而动态顺序表可以动态增容,便于存放大量数据,现主要把动态的基本实现一下~此 ...
随机推荐
- (NO.00001)iOS游戏SpeedBoy Lite成形记(二十六)
到目前为止,选手跑到终点时仿佛没什么激动人心的事情发生呢?貌似需要添加一些胜利的特效啊! 前面说好的不添加特效,只完成游戏功能的诺言呢? T T 我们主要想实现这样一个特效效果: 1.胜利的玩家突出显 ...
- SpriteBuilder中应用智能精灵集之后提示找不到文件的解决
SpriteBuilder中有一个将方便的功能,可以用文件夹中的若干图片生成1张图片;这称之为智能精灵集合(smart sprite sheet).好处是可以一次性的加载图片到显存中去,提升了性能. ...
- TrueType和Bitmap字体的区别
只要标签的文本从不变化,在cocos2D中渲染TrueType和bitmap字体的性能是相同的.它们都仅仅像精灵那样绘制. 如果你希望大量的标签使用相同字体,则bitmap字体将更快.因为bitmap ...
- UTF-8是现在流行的编码方式,根据规定回答问题
UTF-8是现在流行的编码方式,下面是RFC2279对UTF-8编码规则的规定 UCS-4 range (hex.) UTF-8 octet sequence (binary) 0000 0000-0 ...
- eclipse下出现奇怪字符的解决方法
eclipse在代码编辑界面出现了奇怪的字符,如下图: 其中包括:换行符,制表符等. 解决方法如下: 点击工具栏的显示空格字符即可.
- 【freeradius3】安装和拓展需求
这次主要来看看 freeradius的安装,以及Python拓展的例子,还有计费字段根据厂家进行拓展. 3.0版本的安装 参考文章 yum install libtalloc-devel wget - ...
- LeetCode之“动态规划”:Unique Binary Search Trees && Unique Binary Search Trees II
1. Unique Binary Search Trees 题目链接 题目要求: Given n, how many structurally unique BST's (binary search ...
- objc一个NetConnector类示例
NetConnector是自定义的一个类,该类使用代理的方法实现异步下载特定url页面的内容. HyNetConnector.h // // HyNetConnector.h // HyNetConn ...
- java--加强之 Java5的线程并发库
转载请申明出处:http://blog.csdn.net/xmxkf/article/details/9945499 01. 传统线程技术回顾 创建线程的两种传统方式: 1.在Thread子类覆盖的r ...
- masm下几种常见函数调用方式
masm没有fastcall调用方式,其特点为: 1 第一个参数放入ecx,第二个参数放入edx: 2 如果有剩余参数则从右向左压栈: 3 被调用函数清理栈(平衡栈): 4 若有返回值放入eax: 5 ...