如何按双规则对集合高效排序:先按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
相关产品推荐
相关产品推荐

