合并两个ArrayList并排序去零的代码调试求助:输出仅显示第二个列表的问题解决
解决ArrayList合并、排序与去零的问题
我来帮你捋清楚问题所在,以及怎么修复~
首先看你的代码里的几个关键问题:
- 你用
Arrays.asList()创建的列表是固定大小的不可修改列表,就算你想替换元素,直接操作可能会报错; - 你的循环里只是把临时变量
hold赋值成了nums2的元素,根本没对nums1做任何修改,所以打印hold只会输出nums2的内容; - 你还没做合并后的排序和去零操作。
下面给你两种修复方案,按需选择:
方案一:修改原nums1列表
这种方式是把nums2的元素替换到nums1的0位置,再处理去零和排序:
import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; public class MergeListsDemo { public static void main(String[] args) { // 转成可修改的ArrayList(Arrays.asList返回的列表不可修改) List<Integer> nums1 = new ArrayList<>(Arrays.asList(1,2,3,0,0,0)); int m = 3; List<Integer> nums2 = new ArrayList<>(Arrays.asList(2,5,6)); int n = 3; // 将nums2的元素替换到nums1的末尾0位置 for (int i = 0; i < n; i++) { nums1.set(i + m, nums2.get(i)); } // 移除所有0元素 nums1.removeAll(Collections.singleton(0)); // 对合并后的列表排序 Collections.sort(nums1); // 输出结果 System.out.println(nums1); // 输出:[1, 2, 2, 3, 5, 6] } }
方案二:创建新列表合并(不修改原列表)
如果你不想改动原来的nums1和nums2,这种方式更直观:
import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; public class MergeListsDemo { public static void main(String[] args) { List<Integer> nums1 = Arrays.asList(1,2,3,0,0,0); int m = 3; List<Integer> nums2 = Arrays.asList(2,5,6); int n = 3; // 创建新列表存放合并结果 List<Integer> mergedList = new ArrayList<>(); // 添加nums1的有效元素(前m个,排除后面的0) mergedList.addAll(nums1.subList(0, m)); // 添加nums2的所有元素 mergedList.addAll(nums2); // 移除所有0(这里nums1的有效元素没有0,这步可省略,保留是为了通用场景) mergedList.removeAll(Collections.singleton(0)); // 排序 Collections.sort(mergedList); // 输出结果 System.out.println(mergedList); // 输出:[1, 2, 2, 3, 5, 6] } }
关键知识点说明:
Arrays.asList()返回的是java.util.Arrays$ArrayList,不是标准的java.util.ArrayList,它的大小固定,无法自由修改元素,所以必须转成可修改的ArrayList;- 替换列表元素要用
set()方法,临时变量赋值只是存了个值,根本不会影响原列表; removeAll(Collections.singleton(0))可以一次性移除所有0元素,比逐个遍历移除更简洁;Collections.sort()可以直接对List进行自然排序(整数默认升序)。
内容的提问来源于stack exchange,提问作者Sslur
相关产品推荐
相关产品推荐

