You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 00:02:05