【问题标题】:How to custom sort a list in Java如何在 Java 中自定义排序列表
【发布时间】:2021-12-25 18:29:05
【问题描述】:

假设我有一个名为 numbersList 的列表包含以下元素: [ 101, 102, . . 196, 201, 202, . . 296, 301, 302, . . 396, . . 15601, 15602, . . 15696 ]

我想对它进行排序,使其变成这样: [ 101, 201, 301, 15601, 102, 202, 302, 15602, . . 196, 296, 396, 15696 ]

请注意,每个组将始终以第 96 个数字结束。这意味着我将始终从 x01 到 x96,其中 x 是一个长值。

我尝试使用一些循环语句来执行此操作,但我无法到达任何地方,因为我不知道列表中有多少组,这就是为什么我找不到合适的循环。

这是我失败的尝试:(

for (int i = 0 ; i < numbersList.size() ; i = i + groups-1) {
    numbersList2.add(numbersList.get(i));
    for (int j = 0 ; j == groups - 1; j++) {
        int k = i + 96;
        numbersList2.add(numbersList.get(k));
    }
}

group 变量告诉我用户将输入多少组。

【问题讨论】:

    标签: java list sorting collections


    【解决方案1】:

    这可能会有所帮助:

    List<Integer> list = Arrays.asList(101, 102, 103, 201, 202, 203, 295, 296, 301, 302, 303, 304, 396);
    list.sort((o1, o2) -> {
        int v1 = o1 % 100;
        int v2 = o2 % 100;
        if (v1 < v2) {
            return -1;
        } else if (v1 == v2) {
            return o1.compareTo(o2);
        } else {
            return 1;
        }
    });
    System.out.println(Arrays.toString(list.toArray()));
    

    给予:

    [101, 201, 301, 102, 202, 302, 103, 203, 303, 304, 295, 296, 396]
    

    【讨论】:

    • 是的,我想到了这个。但我不知道输入的值是否总是数百个。假设用户输入了 100096,你明白了吗?对不起我的英语
    • 好的......你在问题中写道:Note that each **hundred** group will always ..... 100096%100=96。如果是这种情况,您最好提供您的示例来涵盖该情况,排序后的预期顺序是什么
    • 哦,是的,我的错。我现在就编辑它
    • 我编辑了更多信息。
    • @AwniAhmed 我的方法给出了预期的结果:例如:[101, 201, 301, 15601, 102, 202, 302, 15602, 196, 296, 396, 15696] 你能用它测试你的真实数据吗?
    【解决方案2】:

    这里可以使用链式比较器按余数按模 100 排序,然后按数字排序:

    List<Integer> data = Arrays.asList(401, 101, 602, 102, 103, 196, 201, 202, 205, 296, 301, 302, 396, 15601, 15602,15696);
    
    data.sort(Comparator.<Integer>comparingInt(x -> x % 100)
                        .thenComparingInt(x -> x)
    );
    
    // or this shorter form
    data.sort(Comparator.comparing((Integer x) -> x % 100).thenComparing(x -> x));
    
    System.out.println(data);
    

    输出:

    [101, 201, 301, 401, 15601, 102, 202, 302, 602, 15602, 103, 205, 196, 296, 396, 15696]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-09
      • 1970-01-01
      相关资源
      最近更新 更多