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

Java如何根据超列表元素顺序高效优雅排序对应子列表

实现方案

核心逻辑很直接:把超列表里的元素出现顺序作为排序的优先级规则,元素在超列表里出现得越早,排序后在子列表里的位置就越靠前。

具体实现步骤

  • 先遍历一次超列表,存下每个元素对应的下标位置,做成哈希映射。这一步只花O(N)的时间(N是超列表长度),后续排序的时候查元素位置只需要O(1)时间,比每次比较都循环遍历超列表找位置效率高太多——后者在数据量大的时候性能会差一个量级。
  • 直接用JDK自带的List排序方法,自定义比较器:两个元素比较的时候,直接拿它们在映射表里存的下标比大小,下标更小的元素排前面就行,排序本身的时间复杂度是O(M log M)(M是子列表长度)。

代码示例

import java.util.*;

public class ListSortDemo {
    /**
     * 按照超列表的元素出现顺序,对子列表排序
     * @param subList 待排序的子列表
     * @param superList 作为排序顺序基准的超列表
     * @param <T> 列表元素类型
     */
    public static <T> void sortByReference(List<T> subList, List<T> superList) {
        Map<T, Integer> positionMap = new HashMap<>();
        for (int i = 0; i < superList.size(); i++) {
            // 重复元素默认取第一次出现的位置,有特殊规则可以自行调整
            positionMap.putIfAbsent(superList.get(i), i);
        }

        // 比较器逻辑:按超列表中的位置排序,不存在于超列表的元素默认排到末尾
        subList.sort((a, b) -> {
            int posA = positionMap.getOrDefault(a, Integer.MAX_VALUE);
            int posB = positionMap.getOrDefault(b, Integer.MAX_VALUE);
            return Integer.compare(posA, posB);
        });
    }

    public static void main(String[] args) {
        List<Integer> superList = List.of(3,7,2,8,1,9,4);
        List<Integer> subList = new ArrayList<>(List.of(4,1,7,9));
        sortByReference(subList, superList);
        System.out.println(subList); // 运行输出:[7, 1, 9, 4],完全符合预期
    }
}

方案优势

  • 性能足够好:整体时间复杂度是O(N + M log M),就算超列表、子列表有上万、十万级别的数据量,跑起来也很快。
  • 通用性强:用了泛型实现,只要元素类型正确重写了equals和hashCode方法(比如String、自定义业务实体类),都可以直接用这个方法,不局限于整数列表。
  • 代码简洁好维护:没有手写排序算法,全是复用JDK原生API,逻辑直白,后续要调整规则(比如重复元素处理、不存在元素的排序逻辑)只需要改少量代码就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 21:57:23