Java Vector类reSize()与add()方法实现疑问及代码修正咨询
自定义Vector类的reSize与add方法修正实现
问题分析
原代码存在核心逻辑错误:
reSize方法缩小数组时仅返回单个元素,扩容时错误调用数组不存在的add方法,且未支持指定填充值add方法存在递归调用死循环,参数使用错误,合并逻辑完全缺失
1. 实现支持指定填充值的reSize方法
修改思路:
- 新增
fillValue参数接收扩容时的指定填充值 - 目标长度小于当前长度:创建新数组,复制原数组前
_size个元素 - 目标长度大于当前长度:创建新数组,先复制原数组所有元素,剩余位置用
fillValue填充 - 仅保留长度合法性校验,移除无意义条件判断
修正后的reSize方法:
public Vector reSize(int _size, double fillValue) { if (_size <= 0) { return null; } double[] newElements = new double[_size]; int copyLength = Math.min(doubElements.length, _size); System.arraycopy(doubElements, 0, newElements, 0, copyLength); if (_size > doubElements.length) { for (int i = doubElements.length; i < _size; i++) { newElements[i] = fillValue; } } return new Vector(newElements); }
2. 实现合并另一个Vector的add方法
修改思路:
- 计算合并后的总长度(当前长度 + 待合并Vector的长度)
- 调用
reSize扩容到总长度,填充值可按需设置 - 将待合并Vector的元素复制到新数组末尾
- 完全重构避免递归死循环
修正后的add方法:
public Vector add(Vector _v) { int newSize = this.getVectorSize() + _v.getVectorSize(); Vector resizedVector = this.reSize(newSize, 0.0); System.arraycopy(_v.doubElements, 0, resizedVector.doubElements, this.getVectorSize(), _v.getVectorSize()); return resizedVector; }
如果需求是对应位置元素相加而非追加,可替换为以下实现:
public Vector add(Vector _v) { int targetSize = Math.max(this.getVectorSize(), _v.getVectorSize()); Vector resizedThis = this.reSize(targetSize, 0.0); Vector resizedV = _v.reSize(targetSize, 0.0); double[] resultElements = new double[targetSize]; for (int i = 0; i < targetSize; i++) { resultElements[i] = resizedThis.doubElements[i] + resizedV.doubElements[i]; } return new Vector(resultElements); }
完整修正代码
public class Vector { private double[] doubElements; public Vector(double[] _elements) { // 复制传入数组,避免外部修改影响内部状态 this.doubElements = new double[_elements.length]; System.arraycopy(_elements, 0, this.doubElements, 0, _elements.length); } public int getVectorSize() { return doubElements.length; } // 支持指定填充值的resize方法 public Vector reSize(int _size, double fillValue) { if (_size <= 0) { return null; } double[] newElements = new double[_size]; int copyLength = Math.min(doubElements.length, _size); System.arraycopy(doubElements, 0, newElements, 0, copyLength); if (_size > doubElements.length) { for (int i = doubElements.length; i < _size; i++) { newElements[i] = fillValue; } } return new Vector(newElements); } // 合并另一个Vector(追加元素逻辑) public Vector add(Vector _v) { int newSize = this.getVectorSize() + _v.getVectorSize(); Vector resized = this.reSize(newSize, 0.0); System.arraycopy(_v.doubElements, 0, resized.doubElements, this.getVectorSize(), _v.getVectorSize()); return resized; } // 可选:toString方法方便测试 @Override public String toString() { StringBuilder sb = new StringBuilder("["); for (int i = 0; i < doubElements.length; i++) { sb.append(doubElements[i]); if (i != doubElements.length - 1) { sb.append(", "); } } sb.append("]"); return sb.toString(); } // 测试示例 public static void main(String[] args) { Vector v1 = new Vector(new double[]{1.0, 2.0, 3.0}); // 扩容到5,填充值为-1.0 Vector resizedV1 = v1.reSize(5, -1.0); System.out.println("扩容后的v1: " + resizedV1); // 输出 [1.0, 2.0, 3.0, -1.0, -1.0] Vector v2 = new Vector(new double[]{4.0, 5.0}); Vector merged = v1.add(v2); System.out.println("合并后的Vector: " + merged); // 输出 [1.0, 2.0, 3.0, 4.0, 5.0] } }
内容的提问来源于stack exchange,提问作者Josh
相关产品推荐
相关产品推荐

