当前位置:   article > 正文

数据结构——数组

数据结构——数组

一、数据结构

1、数据结构是一门基础学科

2、研究的是数据如何在计算机中进行组织和存储,使得我们可以高效的获取数据和修改数据

3、数据结构可以分为三类:

 线性结构:数组、队列、栈、链表、哈希表……

树型结构:二叉树、二分搜索树、AVL树、红黑树、堆、Trie、线段树、并查集……

图结构:邻接矩阵、邻接表

排序算法

4、为什么学习数据结构

根据不同的应用,灵活的选择最合适的数据结构

   数据结构 + 算法 = 程序

5、开发环境

IDEA,JDK8+

二、数组

1、数组基础

<1> 用来存储一组类型相同的数据

<2>在内存中,分配连续的空间,数组创建时要指定容量(大小)

<3>数据类型[ ]  数组名  int[ ]  arr = new int[10] 

<4>索引 -- 访问数组时通过索引进行操作

<5>索引从0开始,最大为arr.length - 1

<6>常见的数组:字符串,对象数组,哈希表

<7>常见的错误: NullPointException   ArrayIndexOutOfBoundsException

2、演示数组的使用

3、使用数组时,最重要的就是数组的索引,通过索引可以对数组进行改和查操作

数组最大的优点:快速查询

数组最好应用于索引有语义的情况。

三、实例

基于java中的数组,进行二次封装,可以制作出我们自己的数组(可变数组)

  1. package com.algo.lesson01;
  2. /*
  3. 基于Java中的数组进行二次封装 制作一个可变数组
  4. */
  5. // 泛型:就是类型作为参数
  6. public class MyArr<T> {
  7. private T[] data;//用来保存数据
  8. private int size;//数组中实际存放元素的个数
  9. private int capacity;//容量
  10. public MyArr(int capacity) {
  11. if (capacity <= 0) {
  12. this.capacity = 10;
  13. } else {
  14. this.capacity = capacity;
  15. }
  16. this.size = 0;
  17. this.data = (T[]) new Object[this.capacity];
  18. }
  19. //获取数组中实际存放元素的个数
  20. public int getSize() {
  21. return this.size;
  22. }
  23. //获取数组的容积
  24. public int getCapacity() {
  25. return this.capacity;
  26. }
  27. //判断数组是否为空
  28. public boolean isEmpty() {
  29. return this.size == 0;
  30. }
  31. //向数组中添加元素(在尾部)
  32. public void add(T item) {
  33. //this.size 指向的是待插入元素的位置
  34. addInIndex(this.size, item);
  35. }
  36. // 向数组中添加元素(在头部添加)
  37. public void addHead(T item) {
  38. addInIndex(0, item);
  39. }
  40. //根据索引修改值
  41. public void setValueByIndex(int index, T val) {
  42. if (index < 0 || index >= this.size) {
  43. throw new IllegalArgumentException("index is invalid");
  44. }
  45. this.data[size] = val;
  46. }
  47. //向数组中指定位置添加元素
  48. public void addInIndex(int index, T val) {
  49. if (index < 0 || index > this.size) {
  50. throw new IllegalArgumentException("index is invalid");
  51. }
  52. // 判断数组是否满
  53. if (this.size == this.capacity) {
  54. //扩容
  55. resize(this.capacity * 2);
  56. }
  57. //从index 位置开始元素需要进行后移
  58. for (int i = this.size - 1; i >= index; i--) {
  59. this.data[i + 1] = this.data[i];
  60. }
  61. this.data[index] = val;
  62. //更新 this.size
  63. this.size++;
  64. }
  65. private void resize(int newCapacity) {
  66. T[] newData = (T[]) (new Object[newCapacity]);
  67. //将原数组中元素加入到新数组
  68. for (int i = 0; i < this.size; i++) {
  69. newData[i] = this.data[i];
  70. }
  71. //改变容器与容积
  72. this.data = newData;
  73. this.capacity = newCapacity;
  74. }
  75. //修改指定位置的值
  76. public void modifyValueByIndex(int index, T value) {
  77. //入参一定要判断
  78. if (index < 0 || index >= this.capacity) {
  79. throw new IllegalArgumentException("index is invalid");
  80. }
  81. this.data[index] = value;
  82. }
  83. //获取指定索引位置的值
  84. public T getValueByIndex(int index) {
  85. //入参一定要判断
  86. if (index < 0 || index >= this.capacity) {
  87. throw new IllegalArgumentException("index is invalid");
  88. }
  89. return this.data[index];
  90. }
  91. //查询指定的值在数组中是否存在,如果存在 获取索引 否则返回-1
  92. public int containsValue(T val) {
  93. //遍历数组
  94. for (int i = 0; i < this.size; i++) {
  95. if (val.equals(this.data[i])) {
  96. return i;
  97. }
  98. }
  99. return -1;
  100. }
  101. //根据索引删除从数组中删除元素
  102. public T removeByIndex(int index) {
  103. if (index < 0 || index >= this.capacity) {
  104. throw new IllegalArgumentException("index is invalid");
  105. }
  106. //删除操作的核心
  107. /*
  108. 1、找到删除的位置
  109. 2、删除位置之后的元素要前移 arr[i-1]=arr[j]
  110. */
  111. T delValue = this.data[index];
  112. for (int i = index + 1; i < this.size; i++) {
  113. this.data[i - 1] = this.data[i];
  114. }
  115. this.size--;
  116. //判断是否缩容
  117. if (this.size <= this.capacity / 4 && this.capacity / 2 > 0) {
  118. resize(this.capacity / 2);
  119. }
  120. return delValue;
  121. }
  122. @Override
  123. public String toString() {
  124. StringBuilder sb = new StringBuilder("[");
  125. for (int i = 0; i < this.size; i++) {
  126. sb.append(this.data[i]);
  127. if (i != this.size - 1) {
  128. sb.append(",");
  129. }
  130. }
  131. sb.append("]");
  132. return sb.toString();
  133. }
  134. /*
  135. * 1、如果向数组中继续添加一个元素,就会出错(解决办法:扩容)
  136. * 2、现在只能处理int类型,如何处理多种类型--(解决办法:泛型)
  137. * 3、删除元素后,空间利用率低 --(解决办法:缩容)
  138. * */
  139. }

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

闽ICP备14008679号