如何在Java中自定义列表排序

ckocjqey  于 2023-01-07  发布在  Java
关注(0)|答案(3)|浏览(161)

假设我有一个名为numbersList的列表,其中包含以下元素:[第一百零一条、第一百零二条、第一百九十六条、第二百零一条、第二百零二条、第二百九十六条、第三百零一条、第三百零二条、第三百九十六条、第十五六○一条、第十五六○二条、第十五六○六条]
我想把它排序成这样:[第一○一、二○一、三○一、十五六○一、一○二、二○二、三○二、十五六○二、一○六、二九六、三九六、十五六九六条]
注意,每个组总是在第96个数字结束。这意味着i总是从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告诉我用户将输入多少组。

inkz8wg9

inkz8wg91#

这可能有助于:

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]
fgw7neuy

fgw7neuy2#

这里可以使用链式比较器,以通过模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]
afdcj2ne

afdcj2ne3#

创建一个自定义比较器,如下所示。使用取模运算符%,通过适当的除数(在您的示例中:100,因为您的主要排序顺序是按最后2位)用于主要比较,数字用于次要比较

List<Integer> src = new ArrayList<>(List.of(101, 201, 301, 15601, 102, 202, 302, 15602, 196, 296, 396, 15696));
Comparator<Integer> cmp = (i1, i2) -> {
    int v = Integer.compare(i1 % 100, i2 % 100);
    return v == 0 ? Integer.compare(i1, i2) : v;
};
Collections.sort(src, cmp);
System.out.println(src);

图纸:[101、201、301、15601、102、202、302、15602、196、296、396、15696]

相关问题