如何将Java字符串列表按A→B→C→D循环规则自定义排序
实现思路
- 你之前用
groupingBy分组的思路是对的,自定义Comparator无法实现需求的核心原因是:你的排序规则和元素的出现序号强绑定(比如第1个D要排在第2个A前面),不属于元素自身的静态属性,不适合用两两比较的排序逻辑实现。 - 优化方向是给每个分组构造队列,按固定的[A,B,C,D]顺序循环从队列取元素,直到所有队列元素耗尽即可,逻辑简单且时间复杂度为O(n)(n为原列表长度)。
完整代码示例
import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; public class SortTest { public static void main(String[] args) { List<String> strings = new ArrayList<>(Arrays.asList("A","C","B","D","D","A","B","C","A","D","B","D","A","C")); // 定义固定的取值顺序,后续规则调整只需要修改这个列表即可 List<String> order = Arrays.asList("A", "B", "C", "D"); // 按元素分组,每组转成队列方便弹出首个元素 Map<String, Queue<String>> groupMap = strings.stream() .collect(Collectors.groupingBy( Function.identity(), Collectors.toCollection(LinkedList::new) )); List<String> result = new ArrayList<>(); while (true) { boolean hasRemaining = false; // 每一轮按顺序取每个分组的第一个元素 for (String key : order) { Queue<String> queue = groupMap.get(key); if (queue != null && !queue.isEmpty()) { result.add(queue.poll()); hasRemaining = true; } } // 所有分组都取完了就结束循环 if (!hasRemaining) { break; } } // 输出结果:[A, B, C, D, A, B, C, D, A, B, C, D, A, D] System.out.println(result); } }
内容的提问来源于stack exchange,提问作者wannaBeDev
相关产品推荐
相关产品推荐

