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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 16:04:57