Java使用数组反转实现坐标前置移位输出不全问题排查
问题根源
你写的反转版本addCoordinateRowFront存在三个核心问题:
- 你创建的
newArray是方法内部的局部变量,方法执行完成后就会被销毁,完全没有同步修改类实例持有的newCoordinateArray数组,所有反转操作相当于白做 - 完全没有处理当前数组中已经存在的旧元素:要把新行插到头部,需要先把旧元素整体向后移动,给新行腾出头部的空间,否则旧元素会被覆盖
- 没有更新
numberOfElements计数,打印时只会按原有计数输出旧元素,自然看不到新增的坐标
修正后的数组反转方案实现
这里采用三次反转的高效实现,不需要逐位挪元素,逻辑如下:
void addCoordinateRowFront(CoordinateRow rowOfCoordinates) { int addLen = rowOfCoordinates.numberOfElements; int totalLen = addLen + numberOfElements; // 边界判断,避免超过数组最大容量 if (totalLen > MAX_NUMBER_OF_ELEMENTS) { throw new RuntimeException("坐标数量超过最大限制250"); } // 第一步:先把要新增的行追加到当前数组末尾 for (int i = 0; i < addLen; i++) { newCoordinateArray[numberOfElements + i] = rowOfCoordinates.newCoordinateArray[i]; } // 第二步:反转原有旧元素部分(前numberOfElements个元素) reverse(0, numberOfElements - 1); // 第三步:反转新增的元素部分(后addLen个元素) reverse(numberOfElements, totalLen - 1); // 第四步:反转整个数组,完成前置插入 reverse(0, totalLen - 1); // 更新元素计数 numberOfElements = totalLen; } // 辅助方法:反转数组从start到end区间的元素 void reverse(int start, int end) { while (start < end) { Coordinate temp = newCoordinateArray[start]; newCoordinateArray[start] = newCoordinateArray[end]; newCoordinateArray[end] = temp; start++; end--; } }
如果你不需要三次反转的高效实现,只是想把你之前写的反转逻辑改对,也可以用下面的实现:
void addCoordinateRowFront(CoordinateRow rowOfCoordinates) { int addLen = rowOfCoordinates.numberOfElements; int totalLen = addLen + numberOfElements; if (totalLen > MAX_NUMBER_OF_ELEMENTS) { throw new RuntimeException("坐标数量超过最大限制250"); } // 把原有元素整体后移addLen位,腾出头部空间 for (int i = numberOfElements - 1; i >= 0; i--) { newCoordinateArray[i + addLen] = newCoordinateArray[i]; } // 把要新增的行按顺序放到头部 // 如果你确实需要反转新增行的顺序,就把这里的rowOfCoordinates换成你反转后的数组 for (int i = 0; i < addLen; i++) { newCoordinateArray[i] = rowOfCoordinates.newCoordinateArray[i]; } numberOfElements = totalLen; }
内容的提问来源于stack exchange,提问作者Weightlifting Without Limits
相关产品推荐
相关产品推荐

