如何在Java 8中将数组指定元素移至末尾且不改变其他元素顺序?
Java 8实现将数组零值移至末尾并保持非零元素原有顺序
问题分析
你之前使用Comparator.reverseOrder()进行排序,会对所有元素做降序排列,直接打乱了非零元素的原有顺序,这是不符合需求的。我们需要的是仅将零值移到末尾,非零元素保留原有的出现顺序。
实现方法
方法一:自定义Comparator进行稳定排序
Java的List.sort()是稳定排序,我们可以自定义比较规则:
- 若其中一个元素是0,另一个非0,则让0排在后面
- 两个非0元素比较时返回0,保持它们的原有顺序
完整代码示例:
import java.util.Arrays; import java.util.Comparator; import java.util.List; public class ZeroLast { public static void main(String[] args) { List<Integer> list = Arrays.asList(0,7,4,0,0,8,3,0,0,0,5,6); // 自定义比较器 Comparator<Integer> moveZerosToEnd = (a, b) -> { if (a == 0 && b != 0) { return 1; // a是0,让a排到b后面 } if (a != 0 && b == 0) { return -1; // b是0,让a排到b前面 } return 0; // 非零元素保持原顺序 }; list.sort(moveZerosToEnd); System.out.println(list); // 输出: [7, 4, 8, 3, 5, 6, 0, 0, 0, 0, 0, 0] } }
方法二:使用Stream API拆分合并
通过Stream将非零元素和零元素分开收集,再合并到一起:
import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; public class ZeroLast { public static void main(String[] args) { List<Integer> list = Arrays.asList(0,7,4,0,0,8,3,0,0,0,5,6); // 收集所有非零元素,保留原顺序 List<Integer> nonZeroElements = list.stream() .filter(num -> num != 0) .collect(Collectors.toList()); // 生成对应数量的零元素 List<Integer> zeroElements = Collections.nCopies(list.size() - nonZeroElements.size(), 0); // 合并两个列表 nonZeroElements.addAll(zeroElements); System.out.println(nonZeroElements); // 输出: [7, 4, 8, 3, 5, 6, 0, 0, 0, 0, 0, 0] } }
注意事项
- 若使用
Arrays.asList()创建的列表,其底层是固定大小的数组,但方法一中的sort是在原列表上修改,不会触发扩容;方法二中Collectors.toList()返回的是可修改的ArrayList,因此addAll操作可以正常执行。
内容的提问来源于stack exchange,提问作者Girija Dash
相关产品推荐
相关产品推荐

