[关闭]
@nalan90 2018-05-03T08:42:55.000000Z 字数 3520 阅读 645

数据结构之动态数组

数据结构


属性

接口列表

代码示例
  1. public class Array<E> {
  2. private E[] data;
  3. private int size;
  4. /**
  5. * 构造函数,传入数组的容量capacity构造Array
  6. * @param capacity
  7. */
  8. public Array(int capacity) {
  9. this.data = (E[])new Object[capacity];
  10. this.size = 0;
  11. }
  12. /**
  13. * 无参数的构造函数,默认数组的容量capacity=10
  14. */
  15. public Array() {
  16. this(10);
  17. }
  18. /**
  19. * 获取数组的容量
  20. * @return
  21. */
  22. public int getCapacity() {
  23. return this.data.length;
  24. }
  25. /**
  26. * 获取数组中的元素个数
  27. * @return
  28. */
  29. public int getSize() {
  30. return this.size;
  31. }
  32. /**
  33. * 返回数组是否为空
  34. * @return
  35. */
  36. public boolean isEmpty() {
  37. return this.size == 0;
  38. }
  39. /**
  40. * 在index索引的位置插入一个新元素e
  41. * @param index
  42. * @param e
  43. */
  44. public void add(int index, E e) {
  45. if (index < 0 || index > this.size) {
  46. throw new IllegalArgumentException("Add failed. Required index >= 0 and index <= size");
  47. }
  48. if (this.size == this.data.length) {
  49. resize(this.data.length * 2);
  50. }
  51. for (int i = this.size - 1; i >= index; i--) {
  52. this.data[i + 1] = this.data[i];
  53. }
  54. this.data[index] = e;
  55. this.size ++;
  56. }
  57. /**
  58. * 向所有元素后添加一个新元素
  59. * @param e
  60. */
  61. public void addLast(E e) {
  62. this.add(this.size, e);
  63. }
  64. /**
  65. * 在所有元素前添加一个新元素
  66. * @param e
  67. */
  68. public void addFirst(E e) {
  69. this.add(0, e);
  70. }
  71. /**
  72. * 获取index索引位置的元素
  73. * @param index
  74. * @return
  75. */
  76. public E get(int index) {
  77. if (index < 0 || index >= this.size) {
  78. throw new IllegalArgumentException("Get failed. Index is illegal.");
  79. }
  80. return this.data[index];
  81. }
  82. /**
  83. * 获取第一个元素
  84. * @return
  85. */
  86. public E getFirst() {
  87. return this.get(0);
  88. }
  89. /**
  90. * 获取最后一个元素
  91. * @return
  92. */
  93. public E getLast() {
  94. return this.get(this.size - 1);
  95. }
  96. /**
  97. * 修改index索引位置的元素为e
  98. * @param index
  99. * @param e
  100. */
  101. public void set(int index, E e) {
  102. if (index < 0 || index >= this.size) {
  103. throw new IllegalArgumentException("Set failed. Index is illegal.");
  104. }
  105. this.data[index] = e;
  106. }
  107. /**
  108. * 查找数组中是否有元素e
  109. * @param e
  110. * @return
  111. */
  112. public boolean contains(E e) {
  113. for (int i = 0; i < this.size; i++) {
  114. if (this.data[i].equals(e)) {
  115. return true;
  116. }
  117. }
  118. return false;
  119. }
  120. /**
  121. * 查找数组中元素e所在的索引,如果不存在元素e,则返回-1
  122. * @param e
  123. * @return
  124. */
  125. public int find(E e) {
  126. for (int i = 0; i < this.size; i++) {
  127. if (this.data[i].equals(e)) {
  128. return i;
  129. }
  130. }
  131. return -1;
  132. }
  133. /**
  134. * 从数组中删除index位置的元素, 返回删除的元素
  135. * @param index
  136. * @return
  137. */
  138. public E remove(int index) {
  139. if (index < 0 || index >= this.size) {
  140. throw new IllegalArgumentException("Remove failed. Index is illegal.");
  141. }
  142. E ret = this.data[index];
  143. for (int i = index + 1; i < this.size; i++) {
  144. this.data[i - 1] = this.data[i];
  145. }
  146. this.size --;
  147. this.data[this.size] = null;
  148. if (this.size == this.data.length / 4 && this.data.length / 2 != 0) {
  149. resize(this.data.length / 2);
  150. }
  151. return ret;
  152. }
  153. /**
  154. * 从数组中删除第一个元素, 返回删除的元素
  155. * @return
  156. */
  157. public E removeFirst() {
  158. return this.remove(0);
  159. }
  160. /**
  161. * 从数组中删除最后一个元素, 返回删除的元素
  162. * @return
  163. */
  164. public E removeLast() {
  165. return this.remove(this.size - 1);
  166. }
  167. /**
  168. * 从数组中删除元素e
  169. * @param e
  170. */
  171. public void removeElement(E e) {
  172. int index = this.find(e);
  173. if (index != -1) {
  174. this.remove(index);
  175. }
  176. }
  177. /**
  178. * 交换位置i,j的元素
  179. * @param i
  180. * @param j
  181. */
  182. public void swap(int i, int j) {
  183. if (i < 0 || i >= this.size || j < 0 || j >= this.size) {
  184. throw new IllegalArgumentException("Swap failed. Index is illegal.");
  185. }
  186. E tmp = this.data[i];
  187. this.data[i] = this.data[j];
  188. this.data[j] = tmp;
  189. }
  190. /**
  191. * 将数组空间的容量变成newCapacity大小
  192. * @param newCapacity
  193. */
  194. private void resize(int newCapacity) {
  195. E[] newData = (E[])new Object[newCapacity];
  196. for (int i = 0; i < this.size; i++) {
  197. newData[i] = this.data[i];
  198. }
  199. this.data = newData;
  200. }
  201. @Override
  202. public String toString() {
  203. StringBuilder res = new StringBuilder();
  204. res.append(String.format("Array: size = %d, capacity = %d\n", this.size, this.data.length));
  205. res.append('[');
  206. for (int i = 0; i < this.size; i++) {
  207. res.append(this.data[i]);
  208. if (i != this.size - 1) {
  209. res.append(", ");
  210. }
  211. }
  212. res.append(']');
  213. return res.toString();
  214. }
  215. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注