当前位置:   article > 正文

Java数据结构顺序表实现_java table数据结构

java table数据结构

一,创建一个带泛型的顺序表的类MyList

1,泛型:泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。

         java 中泛型标记符:

         E - Element (在集合中使用,因为集合中存放的是元素)

         T - Type(Java 类)

         K - Key(键)

         V - Value(值)

         N - Number(数值类型)

         ? - 表示不确定的 java 类型

2,定义属性

需要定义长度为0的数组values,存储元素的个数size,数组当前长度length,默认最大容量DEFAULT_LENGTH

  1. public class MyList<A> {
  2. //定义属性
  3. private Object[] values = {};//长度为零的数组
  4. private int size;//当下坐标,当前存储的元素个数
  5. private int length;//表示数组当前的长度 最大容器
  6. private static final int DEFAULT_LENGTH = 10;//默认最大容量
  7. }

二,构造方法

1,顺序表初始化

传入参数为顺序表长度,如果传入长度小于0,报错,如果传入长度小于等于10,就用默认属性初始化,大于10就用传入长度初始化。

  1. public MyList (int initiallength){
  2. if (initiallength <= 0){
  3. throw new IllegalArgumentException("initiallength 不能小于0");
  4. }
  5. if (initiallength <= 10){
  6. length = DEFAULT_LENGTH;
  7. values = new Object[length];
  8. size=0;
  9. }
  10. else{
  11. length = initiallength;
  12. values = new Object[length];
  13. size=0;
  14. }
  15. }

2,添加元素

传入参数为添加元素,如果顺序表还有空直接添加,如果满了需要进行扩容。

扩容:以前的长度设为oldLength,定义新长度为原来的1.5倍,令以前的长度为新长度,定义一个新数组newvalues,通过循环把之前数组里的元素存进新数组里,让初始化数组values等于新数组,再把新数组清空就完成了数组扩容。

移位运算符:在Java>>>的区别:>表示大于,如:if(a>b)...结果是boolean类型>>表示右移,如:int i=15; i>>2的结果是3,移出的部分将被抛弃。转为二进制的形式可能更好理解,0000 1111(15)右移2位的结果是0000 0011(3)0001 1010(18)右移3位的结果是0000 0011(3)

  1. //添加
  2. public void add(A e){
  3. //扩容
  4. if(size == length){
  5. grow();
  6. }
  7. values[size++]=e;
  8. }
  9. public void grow(){
  10. int oldLength = length;
  11. int newLength = oldLength + (oldLength >>1);//1.5倍
  12. length = newLength;
  13. Object[] newvalues = new Object[length];
  14. for (int i = 0;i<oldLength;i++){
  15. newvalues[i] = values[i];
  16. }
  17. //替换引用
  18. values = newvalues;
  19. newvalues=null;
  20. System.out.println("原始容量:"+oldLength+"新增容量:"+newLength);
  21. }

3,根据索引查找元素

传入参数为需要查找的索引,在范围内返回索引对应元素,不在范围报错。

  1. public A get(int index){
  2. // 先检查
  3. if(index>=0&&index<size){
  4. return (A) values[index];
  5. }else{
  6. throw new ArrayIndexOutOfBoundsException("index 超过了范围 max:"+(size-1));
  7. }
  8. }

4,根据元素查找

传入参数为查找元素,循环顺序表判断元素是否相等,返回truefalse

  1. //根据元素查询
  2. //有还是没有
  3. public boolean Get(Object e) {
  4. for (int i = 0; i < length; i++) {
  5. if (values[i] == e || values[i].equals(e)) {
  6. return true;
  7. }
  8. }
  9. return false;
  10. }

5,查找一段元素

传入第一个元素和最后一个元素的索引,超出范围报错,在范围内则遍历输出。

  1. //获取一段
  2. public void getAll(int index,int last){
  3. if(index<0||last<0||index>size-1||last>size-1){
  4. throw new ArrayIndexOutOfBoundsException("index或last 超过了范围");
  5. }else {
  6. for (int i = index; i <= last; i++) {
  7. System.out.println(values[i]);
  8. }
  9. }
  10. }

6,根据索引删除元素

传入删除元素的索引,不在范围内报错,在范围内索引对应元素令为空,通过循环前移索引后的元素。

  1. //检查范围
  2. //将对应位置的元素 设置为null
  3. //后置数据前移一位
  4. //返回移除的元素对象
  5. public A remove(int index){
  6. if(index<0||index>size-1){
  7. throw new ArrayIndexOutOfBoundsException("index 超过了范围 max:"+(size-1));
  8. }else{
  9. values[index]=null;
  10. for(int i=index;i<size;i++){
  11. values[i]=values[i+1];
  12. }
  13. }
  14. return null;
  15. }

7,删除所有相同元素

传入需要删除的元素,通过循环找到相等的元素,令为空,前移后面的元素。

  1. //找到所有的对象所在的下标位置
  2. //分别清除之后 数据移动位置
  3. public Object Remove(Object e){
  4. for(int i=0;i<size;i++){
  5. if(values[i]==e){
  6. values[i]=null;
  7. for( int x=i ;x<size;x++){
  8. values[x]=values[x+1];
  9. }
  10. }
  11. }
  12. return true;
  13. }

8,根据索引移除一段

传入删除一段的第一个元素索引和最后一个元素索引,不在范围报错,在范围最后一个元素索引后的元素前移。

  1. public void removeAll(int index,int last){
  2. if(index<0||last<0||index>size-1||last>size-1){
  3. throw new ArrayIndexOutOfBoundsException("index或last 超过了范围");
  4. }else{
  5. int n = 1;
  6. for (int y=index ;y<size ;y++ ){
  7. values[y]=values[last+n];
  8. n++;
  9. }
  10. size -= (last-index)+1;
  11. }
  12. }

9,添加数组

传入一个数组,循环去除里面的元素依次添加,有空直接添加,没空先扩容再添加。

三,完整代码

  1. public class MyList<A> {
  2. //定义属性
  3. private Object[] values = {};//长度为零的数组
  4. private int size;//当下坐标,当前存储的元素个数
  5. private int length;//表示数组当前的长度 最大容器
  6. private static final int DEFAULT_LENGTH = 10;//默认最大容量
  7. //构造方法
  8. public MyList (int initiallength){
  9. if (initiallength <= 0){
  10. throw new IllegalArgumentException("initiallength 不能小于0");
  11. }
  12. if (initiallength <= 10){
  13. length = DEFAULT_LENGTH;
  14. values = new Object[length];
  15. size=0;
  16. }
  17. else{
  18. length = initiallength;
  19. values = new Object[length];
  20. size=0;
  21. }
  22. }
  23. //添加
  24. public void add(A e){
  25. //扩容
  26. if(size == length){
  27. grow();
  28. }
  29. values[size++]=e;
  30. }
  31. public void grow(){
  32. int oldLength = length;
  33. int newLength = oldLength + (oldLength >>1);//1.5倍
  34. length = newLength;
  35. Object[] newvalues = new Object[length];
  36. for (int i = 0;i<oldLength;i++){
  37. newvalues[i] = values[i];
  38. }
  39. //替换引用
  40. values = newvalues;
  41. newvalues=null;
  42. System.out.println("原始容量:"+oldLength+"新增容量:"+newLength);
  43. }
  44. public A get(int index){
  45. // 先检查
  46. if(index>=0&&index<size){
  47. return (A) values[index];
  48. }else{
  49. throw new ArrayIndexOutOfBoundsException("index 超过了范围 max:"+(size-1));
  50. }
  51. }
  52. //根据元素查询
  53. //有还是没有
  54. public boolean Get(Object e) {
  55. for (int i = 0; i < length; i++) {
  56. if (values[i] == e || values[i].equals(e)) {
  57. return true;
  58. }
  59. }
  60. return false;
  61. }
  62. //获取一段
  63. public void getAll(int index,int last){
  64. if(index<0||last<0||index>size-1||last>size-1){
  65. throw new ArrayIndexOutOfBoundsException("index或last 超过了范围");
  66. }else {
  67. for (int i = index; i <= last; i++) {
  68. System.out.println(values[i]);
  69. }
  70. }
  71. }
  72. //检查范围
  73. //将对应位置的元素 设置为null
  74. //后置数据前移一位
  75. //返回移除的元素对象
  76. public A remove(int index){
  77. if(index<0||index>size-1){
  78. throw new ArrayIndexOutOfBoundsException("index 超过了范围 max:"+(size-1));
  79. }else{
  80. values[index]=null;
  81. for(int i=index;i<size;i++){
  82. values[i]=values[i+1];
  83. }
  84. }
  85. return null;
  86. }
  87. //找到所有的对象所在的下标位置
  88. //分别清除之后 数据移动位置
  89. public Object Remove(Object e){
  90. for(int i=0;i<size;i++){
  91. if(values[i]==e){
  92. values[i]=null;
  93. for( int x=i ;x<size;x++){
  94. values[x]=values[x+1];
  95. }
  96. }
  97. }
  98. return true;
  99. }
  100. public void removeAll(int index,int last){
  101. if(index<0||last<0||index>size-1||last>size-1){
  102. throw new ArrayIndexOutOfBoundsException("index或last 超过了范围");
  103. }else{
  104. int n = 1;
  105. for (int y=index ;y<size ;y++ ){
  106. values[y]=values[last+n];
  107. n++;
  108. }
  109. size -= (last-index)+1;
  110. }
  111. }
  112. public void addAll(Object[] objArr){
  113. if(objArr.length < length-size){
  114. for (int i = 0; i < objArr.length; i++) {
  115. add ((A) objArr[i]);
  116. }
  117. }else{
  118. grow ();
  119. addAll (objArr);
  120. }
  121. }
  122. public static void main(String[] args){
  123. MyList<Integer> myList = new MyList(50);
  124. System.out.println("----------MyList----------");
  125. long Start = System.currentTimeMillis ();
  126. for (int i =0;i<500000;i++){
  127. myList.add(i);
  128. }
  129. long End = System.currentTimeMillis ();
  130. System.out.println ("存储50万组数据- 耗时:"+(End-Start));
  131. Start = System.currentTimeMillis ();
  132. for (int i = 1; i < 5000;i++) {
  133. Integer integer = myList.get (i);
  134. }
  135. End = System.currentTimeMillis ();
  136. System.out.println ("查询多个数据- 耗时:"+(End-Start));
  137. Start = System.currentTimeMillis ();
  138. for (int i = 1; i < 5000;i++) {
  139. Integer integer = myList.remove(i);
  140. }
  141. End = System.currentTimeMillis ();
  142. System.out.println ("移除多个数据- 耗时:"+(End-Start));
  143. }
  144. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/538292
推荐阅读
相关标签
  

闽ICP备14008679号