合并数组操作

本文档展示了如何使用Java编程语言,通过for循环遍历数组oldArr,跳过所有值为0的元素,并打印非零数值。这对于处理数据预处理或清洗时筛选有效数据很有用。

public class ZuoYe6 {
    public static void main(String[] args) {
        System.out.println("输出的新数组newArr为:");
        int[] oldArr={1,3,4,5,0,0,6,6,0,5,4,7,6,7,0,5};
        for (int i=0;i<=oldArr.length-1;i++){
            if (oldArr[i]==0){
                continue;
            }
            System.out.print(oldArr[i]+"\t");
        }

    }
}
 

<think> 根据用户当前的问题,他询问的是合并数组操作方法。结合提供的引用内容,我将总结多种合并数组的方法,并比较它们的优缺点。用户之前的问题是关于舵机角度控制的滤波,但当前问题转向了JavaScript数组合并,因此我将专注于回答当前问题。 以下是合并数组操作方法的总结: ### 一、JavaScript 中合并数组的常用方法 #### 1. **concat() 方法** - 语法:`const newArray = array1.concat(array2);` - 特点: - 返回一个新数组,不改变原数组 - 支持合并多个数组(例如 `array1.concat(array2, array3)`) - 示例: ```javascript const a = [1, 2]; const b = [3, 4]; const c = a.concat(b); // [1, 2, 3, 4] ``` - 适用场景:需要保持原数组不变的场景[^3]。 #### 2. **扩展运算符(Spread Operator)** - 语法:`const newArray = [...array1, ...array2];` - 特点: - 直观简洁,现代JavaScript推荐方式 - 同样不改变原数组 - 示例: ```javascript const a = [1, 2]; const b = [3, 4]; const c = [...a, ...b]; // [1, 2, 3, 4] ``` - 缺点:处理超大数组时可能存在性能问题(创建新数组)[^5]。 #### 3. **push() 方法(修改原数组)** - 语法:`array1.push(...array2);` - 特点: - 直接修改原数组(此处 `array1` 将被改变) - 使用扩展运算符将第二个数组“展开”后逐个推入 - 示例: ```javascript const a = [1, 2]; const b = [3, 4]; a.push(...b); // a 变为 [1, 2, 3, 4] ``` - 注意事项:`push` 方法本身接受多个参数,因此需用扩展运算符展开数组[^2]。 #### 4. **apply() 方法(旧式写法)** - 语法:`Array.prototype.push.apply(array1, array2)` - 特点: - 修改原数组(`array1`) - 在ES6之前常用,现已被扩展运算符取代 - 示例: ```javascript const a = [1, 2]; const b = [3, 4]; Array.prototype.push.apply(a, b); // a 变为 [1, 2, 3, 4] ``` - 缺点:可读性较差,且当第二个数组过大时可能超出函数参数长度限制[^2]。 #### 5. **reduce() 方法(灵活合并)** - 语法示例:`const merged = arrays.reduce((acc, arr) => [...acc, ...arr], []);` - 特点: - 适用于合并多个数组(如二维数组扁平化) - 不修改原数组,但性能较低(循环+扩展运算符) - 替代方案(高效扁平化):`[].concat(...arrays)` 或 `arrays.flat()`[^3]。 #### 6. **Array.from()(特殊场景)** - 可用于合并可迭代对象: ```javascript const set1 = new Set([1, 2]); const set2 = new Set([3, 4]); const merged = Array.from([...set1, ...set2]); ``` - 适用场景:合并数组的可迭代对象[^3]。 --- ### 二、合并方法性能对比 | 方法 | 是否修改原数组 | 时间复杂度 | 适用场景 | |--------------------|----------------|------------------|-----------------------------| | `concat()` | 否 | $O(n)$ | 通用合并,需保留原数组 | | 扩展运算符 | 否 | $O(n)$ | 现代语法,代码简洁 | | `push(...arr)` | 是 | $O(m)$(m为新增长度) | 需修改原数组 | | `apply()` | 是 | $O(m)$ | 兼容老浏览器 | | `reduce()` | 否 | $O(n^2)$(扩展运算符) | 多数组合并,不推荐大数组 | > **注意**:扩展运算符和`concat`在合并数组时都会创建新数组,内存占用较高[^5]。 --- ### 三、Dart/Flutter 中的数组合并 用户引用中包含了Flutter的示例,补充如下: ```dart // 使用 + 运算符 List<int> list1 = [1, 2]; List<int> list2 = [3, 4]; List<int> merged = list1 + list2; // [1, 2, 3, 4] // 使用扩展运算符 List<int> merged2 = [...list1, ...list2]; ``` --- ### 四、最佳实践建议 1. **优先选择扩展运算符**:语法简洁,适用于大多数场景。 2. **大数组合并**:使用循环 + `push` 避免内存暴涨(分块处理)。 ```javascript // 高效合并数组 for (let i = 0; i < largeArray.length; i++) { targetArray.push(largeArray[i]); } ``` 3. **避免在循环中合并**:尤其是使用扩展运算符或`concat`会重复创建新数组。 --- §§相关问题§§ 1. 如何在 JavaScript 中高效合并超大数组? 2. 数组合并时如何处理重复元素? 3. 扩展运算符和 `concat()` 在 TypeScript 中有何区别? 4. 如何用 `reduce` 实现多数组的深层合并? 5. 在 React/Vue 状态管理中合并数组有哪些注意事项? [^1]: 前端开发:JavaScript合并数组的方法 [^2]: js合并数组的方法大全 [^3]: JS合并数组(5种方法) [^4]: flutter合并数组操作符 [^5]: 合并数组的两种常用方法比较 </think> ### 合并数组操作方法总结 在编程中合并数组是常见操作,不同语言有各自的实现方式。以下是主流方法的分类说明(以 JavaScript 为主,补充 Dart 示例): #### 一、JavaScript 中的合并方法 1. **concat() 方法** - 语法: `const newArr = arr1.concat(arr2)` - 特点: - 不修改原数组,返回新数组 - 可合并多个数组 `arr1.concat(arr2, arr3)` - 示例代码: ```javascript const a = [1, 2]; const b = [3, 4]; const c = a.concat(b); // [1, 2, 3, 4] ``` 2. **扩展运算符 (...)** - 语法: `const newArr = [...arr1, ...arr2]` - 特点: - 语法简洁直观(ES6+) - 保持不可变性(原数组不变) - 示例代码: ```javascript const merged = [...[1, 2], ...[3, 4]]; // [1, 2, 3, 4] ``` 3. **push.apply() 方法** - 语法: `Array.prototype.push.apply(arr1, arr2)` - 特点: - 直接修改原数组(`arr1` 被改变) - 适用于大数组合并数组 - 示例代码: ```javascript const a = [1, 2]; Array.prototype.push.apply(a, [3, 4]); // a 变为 [1, 2, 3, 4] ``` #### 二、Dart 中的合并方法 ```dart // 使用 + 运算符 List<int> list1 = [1, 2]; List<int> list2 = [3, 4]; List<int> merged = list1 + list2; // [1, 2, 3, 4] // 使用扩展运算符 List<int> merged2 = [...list1, ...list2]; ``` #### 三、方法对比与选择建议 | 方法 | 是否修改原数组 | 时间复杂度 | 适用场景 | |--------------------|----------------|------------|------------------------------| | `concat()` | 否 | $O(n)$ | 需要保留原数组的通用场景 | | 扩展运算符 `...` | 否 | $O(n)$ | 现代语法,代码简洁 | | `push.apply()` | 是 | $O(m)$ | 大数组合并数组[^2] | | Dart 的 `+` 运算符 | 否 | $O(n)$ | Dart/Flutter 项目 | > **关键决策点**: > - 需要不可变性 → 选择 `concat()` 或扩展运算符[^3][^5] > - 内存敏感场景 → 避免扩展运算符对大数组操作[^5] > - 修改原数组 → 使用 `push.apply()`[^2] #### 四、进阶技巧 1. **过滤重复项**: ```javascript const uniqueMerge = [...new Set([...arr1, ...arr2])]; ``` 2. **条件合并**: ```javascript const merged = [...arr1, ...(condition ? arr2 : [])]; ``` 3. **多维数组合并**: ```javascript const deepMerge = [].concat(...[[1,2], [3,[4]], 5]); // [1, 2, 3, [4], 5] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值