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

如何将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 12:54:03