[英]How to custom sort a list in Java
假设我有一个名为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
变量告诉我用户将输入多少个组。
这可能有帮助:
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]
最干净的答案是使用Comparator接口,您应该创建一个实现此接口的类并实现比较方法。
例子:
class People {
int id;
String name,
String address;
...
}
class SortById implements Comparator<People> {
public int compare(People a, People b) {
return a.id - b.id;
}
}
class SortByName implements Comparator<People> {
// Used for sorting in ascending order
public int compare(People a, People b) {
return a.name.compareTo(b.name);
}
}
它的可重用性很高。
此处可使用链式比较器按余数按模 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]
创建一个自定义比较器,如下所示。 使用模数运算符 % 使用适当的除数(在您的示例中: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]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.