MyArray.java 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. package homework_0724.p2_myarray;
  2. import java.util.Arrays;
  3. /**
  4. * @author WanJl
  5. * @version 1.0
  6. * @title MyArray
  7. * @description
  8. * @create 2026/7/27
  9. */
  10. public class MyArray {
  11. //内部真正存储数据的数组
  12. private int[] data;
  13. //当前已存储的元素个数(不是数组长度)
  14. private int size;
  15. /**
  16. * 无参构造,默认初始化容量为 10 的数组
  17. */
  18. public MyArray() {
  19. this.data=new int[10];
  20. }
  21. /**
  22. * 指定初始容量,如果传入的容量 ≤ 0,则使用默认容量 10
  23. * @param capacity
  24. */
  25. public MyArray(int capacity) {
  26. if (capacity<=0) {
  27. this.data=new int[10];
  28. }else {
  29. this.data=new int[capacity];
  30. }
  31. }
  32. /**
  33. * 1. 添加元素 — add(int element)
  34. * 如果内部数组已满,自动扩容为当前容量的 1.5 倍(data.length * 3 / 2)
  35. * 扩容步骤:创建新数组 → 复制旧元素 → 替换 data 引用
  36. * 将新元素存入 data[size],size 自增 1
  37. * @param element
  38. */
  39. public void add(int element){
  40. int[] newArr;
  41. if(size>=data.length){ //内部数组已满--已存储元素等于数组长度
  42. newArr=new int[data.length*3/2];
  43. }else {
  44. newArr=new int[data.length];
  45. }
  46. //复制旧数组的元素到新数组
  47. for (int i = 0; i < size; i++) {
  48. newArr[i]=data[i];
  49. }
  50. //插入最新元素到数组末尾
  51. newArr[size]=element;
  52. //元素个数++
  53. size++;
  54. //替换 data 引用
  55. this.data=newArr;
  56. }
  57. /**
  58. * 2. 获取元素 — get(int index)
  59. * 下标越界时输出 "下标越界,无法获取元素",返回 -1
  60. * 否则返回 data[index]
  61. * @param index
  62. * @return
  63. */
  64. public int get(int index){
  65. if (index>=size){
  66. System.out.println("下标越界,无法获取元素");
  67. return -1;
  68. }
  69. return data[index];
  70. }
  71. /**
  72. * 3. 修改元素 — set(int index, int element)
  73. * 下标越界时输出 "下标越界,无法修改元素"
  74. * 否则将 data[index] 赋值为 element
  75. * @param index
  76. * @param element
  77. */
  78. public void set(int index, int element){
  79. if (index>=size){
  80. System.out.println("下标越界,无法修改元素");
  81. }else {
  82. //完成赋值
  83. data[index]=element;
  84. }
  85. }
  86. /**
  87. * 9. 删除指定位置的元素 — remove(int index)
  88. * 下标越界时输出 "下标越界,无法删除元素",返回 -1
  89. * 否则:保存被删除的值 → 后面元素前移一位 → size-- → 返回被删除的值
  90. * @param index
  91. * @return
  92. */
  93. public int remove(int index){
  94. if (index>=size){
  95. System.out.println("下标越界,无法删除元素");
  96. return -1;
  97. }
  98. //保存被删除的值
  99. int del=data[index];
  100. //建立新的数组
  101. int[] newArr=new int[data.length];
  102. //循环--复制旧数组的Index之前的元素到新数组的对应位置
  103. for (int i = 0; i < size-1; i++) {
  104. if (i<index){
  105. newArr[i]=data[i];
  106. }else {
  107. newArr[i]=data[i+1];
  108. }
  109. }
  110. //新数组替换旧数组
  111. data=newArr;
  112. //size-1
  113. size--;
  114. return del;
  115. }
  116. /**
  117. * 11. 数组排序 — sort(boolean ascending)
  118. * true 升序,false 降序
  119. * 使用冒泡排序,只对 data[0] ~ data[size-1] 排序
  120. * @param ascending
  121. */
  122. public void sort(boolean ascending){
  123. for (int i = 0; i < size-1; i++) {
  124. for (int j = 0; j < size-1-i; j++) {
  125. if (ascending){
  126. if (data[j]>data[j+1]){
  127. exchange(j, j+1);
  128. }
  129. }else {
  130. if (data[j]<data[j+1]){
  131. exchange(j, j+1);
  132. }
  133. }
  134. }
  135. }
  136. }
  137. /**
  138. * 私有的交换函数
  139. * @param a 索引值1
  140. * @param b 索引值2
  141. */
  142. private void exchange(int a,int b){
  143. int t=data[a];
  144. data[a]=data[b];
  145. data[b]=t;
  146. }
  147. /**
  148. * print()
  149. * 遍历输出格式:[元素1, 元素2, 元素3, ...]
  150. * 空数组输出 []
  151. */
  152. public void print(){
  153. if (size>0){
  154. System.out.print("[");
  155. for (int i = 0; i <size; i++) {
  156. System.out.print(data[i]);
  157. if (i<size-1)
  158. System.out.print(", ");
  159. }
  160. System.out.println("]");
  161. }else {
  162. System.out.println("[]");
  163. }
  164. }
  165. /**
  166. * 返回 size 属性值
  167. * @return
  168. */
  169. public int size(){
  170. return this.size;
  171. }
  172. }