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

如何按双规则对集合高效排序:先按value取前三再后置id≠1的元素

自定义排序需求实现

实现思路

  • 第一步:对原始列表按value字段升序排序,截取前3个元素,保留排序后的相对顺序
  • 第二步:将前3个元素拆分为两组:id=1的元素组、id≠1的元素组,两组内部均保留第一步排序后的顺序
  • 第三步:先拼接id=1的元素组,再拼接id≠1的元素组,得到最终结果

代码实现

首先补全测试类的getter方法:

class Test {
    int id;
    int value;

    public Test(int id, int value) {
        this.id = id;
        this.value = value;
    }

    public int getId() {
        return id;
    }

    public int getValue() {
        return value;
    }
}

排序逻辑实现(Java 8+ 版本,简洁易读):

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

public class CustomSort {
    public static List<Test> sort(List<Test> originList) {
        // 按value升序取前3
        List<Test> top3ByValue = originList.stream()
                .sorted(Comparator.comparingInt(Test::getValue))
                .limit(3)
                .collect(Collectors.toList());

        List<Test> result = new ArrayList<>();
        // 先放id=1的元素,保留原有顺序
        top3ByValue.stream().filter(item -> item.getId() == 1).forEach(result::add);
        // 再放id≠1的元素,保留原有顺序
        top3ByValue.stream().filter(item -> item.getId() != 1).forEach(result::add);

        return result;
    }

    // 测试验证
    public static void main(String[] args) {
        Test a = new Test(1,4);
        Test b = new Test(2,3);
        Test c = new Test(1,1);
        Test d = new Test(2,5);
        List<Test> originList = List.of(a, b, c, d);
        List<Test> finalResult = sort(originList);
        // 输出结果和示例要求完全一致
        finalResult.forEach(item -> System.out.printf("id:%d value:%d%n", item.getId(), item.getValue()));
    }
}

效率说明

常规业务场景下上述实现性能足够:排序时间复杂度为O(nlogn),后续分组拼接操作仅涉及3个元素,时间复杂度可忽略。如果面对超大规模数据(百万级以上),可将排序取Top3的逻辑替换为单次遍历取Top3的算法,时间复杂度可优化到O(n)。

内容的提问来源于stack exchange,提问作者cmfu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 08:39:03