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
相关产品推荐
相关产品推荐

