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

 更新时间:2014年03月17日 09:18:46   作者:  
这篇文章主要介绍了java数据结构实现顺序表示例,需要的朋友可以参考下
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

复制代码 代码如下:

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 = new Object[default_length];
 }
 /**
  * 指定长度进行构造
  * @param length 指定初始长度
  */
 public LineList(int length){
  if(length<0){
   throw new IllegalArgumentException("初始长度不合法:"+length);
  }
  //使用指定长度构造数组
  array = new Object[length];
 }

 /**
  * 指定初始化元素和长度进行构造
  * @param element 初始化元素
  * @param length 初始化长度
  */
 public LineList(E element,int length){
  if(length<1){
   throw new IllegalArgumentException("初始长度不合法:"+length);
  }
  //使用指定长度构造数组
  array = new Object[length];
  //初始化第一个元素
  array[0] = element;
  size++;
 }
 /**
  * 指定初始化元素进行构造
  * @param element 初始化元素
  */
 public LineList(E element){
  //使用默认长度初始化数组
  array = new Object[default_length];
  //初始化第一个元素
  array[0] = element;
 }

 /**
  * 获取元素个数
  */
 public int size() {
  return size;
 }

 /**
  * 判断是否为空
  */
 public boolean isEmpty() {
  return size==0;
 }

 /**
  * 判断是否包含此元素
  */
 public boolean contains(E e) {
  if(indexOf(e) == -1){
   return false;
  }
  return true;
 }

 /**
  * 格式化为数组
  */
 public Object[] toArray() {
  return Arrays.copyOf(array, size);
 }

 /**
  * 向线性表尾部添加一个元素
  * @param e
  * @return
  */
 public void add(E e) {
  extendCapacity(size+1);
  array[size]=e;
  size++;
 }

 /**
  * 扩容
  * @param length 需要的长度
  */
 private void extendCapacity(int length){
  //当前数组长度和需要的长度取最大
  int minCapacity = Math.max(array.length, length);
  //判断是否需要扩容
  if(minCapacity - array.length>0){
   //数组长度增加一半
   int newLength = array.length + array.length/2;
   //如果新的长度还比需求要小,将需求的长度作为数组长度
   if(newLength < minCapacity){
    newLength=minCapacity;
   }
   //数组长度不能超过Integer.Max_Value
   if(newLength > Integer.MAX_VALUE - 8){
    newLength = Integer.MAX_VALUE;
   }
   //数组扩容
   array = Arrays.copyOf(array, newLength);
  }
 }
 /**
  * 从线性表中移除所有此元素
  * @param e 需要移除的元素
  * @return
  */
 public void removeAll(E e) {
  if(e==null){
   for(int i=0;i<size;i++){
    if(array[i]==null){
     fastRemove(i);
    }
   }
  }else{
   for(int i=0;i<size;i++){
    if(e.equals(array[i])){
     fastRemove(i);
    }
   }
  }
 }

 /**
  * 删除索引处元素,后面的元素依次前移
  * @param index 需要删除的索引
  */
 private void fastRemove(int index){
  if(size-index-1>0){  
   //数组从index+1开始全部前移
   System.arraycopy(array, index+1, array, index, size-1);
  }
  //最后一个元素请空
  array[--size]=null;
 }

 /**
  * 清空线性表
  */
 public void clear() {
  //将数组全部填充为null
  Arrays.fill(array, null);
  //将元素个数改为0
  size=0;
 }
 /**
  * 获得索引处的元素
  * @param index
  * @return 索引处的元素
  */
 @SuppressWarnings("unchecked")
 public E get(int index) {
  checkIndex(index);
  return (E)array[index];
 }

 /**
  * 验证是否为索引越界
  * @param index
  */
 private void checkIndex(int index){
  if(index>=size || index<0){
   throw new IndexOutOfBoundsException("索引越界");
  }
 }

 /**
  * 将索引处的元素修改为新的元素
  * @param index 索引位置
  * @param element 元素
  * @return 原索引处的元素
  */
 @SuppressWarnings("unchecked")
 public E set(int index, E element) {
  checkIndex(index);
  E e = (E)array[index];
  array[index]=element;
  return e;
 }

 /**
  * 在指定的索引处插入指定的元素
  * @param index 索引位置
  * @param element 元素
  */
 public void add(int index, E element) {
  //验证索引
  checkIndex(index);
  //是否需要扩容
  extendCapacity(size+1);
  //复制数组
  System.arraycopy(array, index, array, index+1, size-index);
  array[index]=element;
 }

 /**
  * 移除索引处的元素
  * @param index 索引
  * @return 删除了的元素
  */
 @SuppressWarnings("unchecked")
 public E remove(int index) {
  checkIndex(index);
  //取得索引位置的元素
  E e = (E)array[index];
  fastRemove(index);
  return e;
 }

 /**
  * 取得元素第一次出现的位置的索引
  * @param e 要查找的元素
  * @return 如果为-1说明线性表没有这个元素
  */
 public int indexOf(E e) {
  if(e==null){
   for(int i=0;i<size;i++){
    if(e==array[i]){
     return i;
    }
   }
  }
  for(int i=0;i<size;i++){
   if(e.equals(array[i])){
    return i;
   }
  }
  return -1;
 }

 /**
  * 取得元素最后一次出现的位置的索引
  * @param e 要查找的元素
  * @return 如果为-1说明线性表没有这个元素
  */
 public int lastIndexOf(E e) {
  //判断元素是否为null
  if(e==null){    
   for(int i=size-1;i>=0;i--){
    if(e==array[i]){
     return i;
    }
   }
  }
  for(int i=size-1;i>=0;i--){
   //如果为null这里会跑出NullPoint异常
   //所以前面要加上验证是否为Null
   if(e.equals(array[i])){
    return i;
   }
  }
  return -1;
 }

 /**
  * 截取线性表
  * @param fromIndex 开始索引
  * @param toIndex 结束索引
  * @return 截取的线性表
  */
 @SuppressWarnings("unchecked")
 public LineList<E> subList(int fromIndex, int toIndex) {
  //判断开始索引是否越界
  if(fromIndex<0 || fromIndex >=size){
   throw new IndexOutOfBoundsException("开始索引越界:"+fromIndex);
  }
  //判断结束索引是否越界
  if(toIndex >=size || fromIndex <0){
   throw new IndexOutOfBoundsException("结束索引越界:"+toIndex);
  }
  //判断开始索引和结束索引是否正确
  if(fromIndex > toIndex){
   throw new IllegalArgumentException("参数不正确,开始索引应大于等于结束索引");
  }
  LineList<E> list = new LineList<E>();
  for(int i=fromIndex,j=toIndex;i<=j;i++){
   list.add((E)array[i]);
  }
  return list;
 }
}

相关文章

  • RabbitMQ交换机与Springboot整合的简单实现

    RabbitMQ交换机与Springboot整合的简单实现

    这篇文章主要介绍了RabbitMQ交换机与Springboot整合的简单实现,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • java实现任意矩阵Strassen算法

    java实现任意矩阵Strassen算法

    这篇文章主要介绍了java实现任意矩阵Strassen算法的相关资料,需要的朋友可以参考下
    2016-02-02
  • Java项目中classpath类路径是什么

    Java项目中classpath类路径是什么

    classpath指的是类路径,也就是编译之后的target文件夹下的WEB-INF/class文件夹,下面这篇文章主要给大家介绍了关于Java项目中classpath类路径是什么的相关资料,需要的朋友可以参考下
    2023-02-02
  • 深入了解Java内部类的用法

    深入了解Java内部类的用法

    java类的五大成员:属性,方法,构造器(构造方法),代码块,内部类。本文就来和大家详细讲讲ava内部类的用法,需要的小伙伴可以参考一下
    2022-07-07
  • Java实现视频时间维度剪切的工具类

    Java实现视频时间维度剪切的工具类

    这篇文章主要为大家详细介绍了将视频按照时间维度进行剪切的Java工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-12-12
  • mybatis映射和实际类型不一致的问题

    mybatis映射和实际类型不一致的问题

    这篇文章主要介绍了mybatis映射和实际类型不一致的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • MyBatis缓存功能原理及实例解析

    MyBatis缓存功能原理及实例解析

    这篇文章主要介绍了MyBatis缓存功能原理及实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 基于hibernate框架在eclipse下的配置方法(必看篇)

    基于hibernate框架在eclipse下的配置方法(必看篇)

    下面小编就为大家带来一篇基于hibernate框架在eclipse下的配置方法(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • Sentinel实现动态配置的集群流控的方法

    Sentinel实现动态配置的集群流控的方法

    这篇文章主要介绍了Sentinel实现动态配置的集群流控,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • 如何用IDEA调试BUG的几种方法

    如何用IDEA调试BUG的几种方法

    这篇文章主要介绍了如何用IDEA调试BUG的几种方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2020-03-03

最新评论


http://www.vxiaotou.com