对 Java 中具有特殊字符的整数进行排序
Sort integers having special character in Java
我遇到一个问题,我需要按升序或降序对由连字符分隔的整数进行排序。
我尝试使用
Collections.sort(list, Collections.reverseOrder());
其中 list
是 ArrayList
创建的一个实例,但它没有给我确切的结果。
arrayList 如下所示:
[91,95,96-1,94-2,94-1,100-2].
预期的方式是:
[91,94-1,94-2,95,96-1,100-2]
对字符串使用默认排序将使用字典顺序,而您打算按数字顺序对字符串进行排序(如果第一个数字相等,则按第二个数字排序)。实现此目的的一种方法是使用两个比较器:
List<String> list = new ArrayList<>(Arrays.asList("96-1","91","94-2","100-2","94-1","95"));
System.out.println("Unsorted: "+list);
Comparator<String> primaryComparator =
(a,b)->Integer.valueOf(a.split("-")[0])
.compareTo(Integer.valueOf(b.split("-")[0]));
Comparator<String> secondaryComparator =
(a,b)->Integer.valueOf(a.split("-")[1])
.compareTo(Integer.valueOf(b.split("-")[1]));
list.sort(primaryComparator.thenComparing(secondaryComparator));
System.out.println("Sorted: "+list);
list.sort(primaryComparator.thenComparing(secondaryComparator).reversed());
System.out.println("Sorted in reverse: "+list);
至于比较器本身,我假设列表中的字符串始终有效,并且始终采用 \d+(-\d+)?
形式,因此要么是一个整数,要么是两个用连字符分隔的整数。 (如果不是这种情况,您可能需要添加一些额外的 checks/validations 和自定义 Java 7 样式比较器,以使其比 Java 8 样式 lambda 更具可读性。)
.split("-")[0]
/ .split("-")[1]
将在连字符上拆分此字符串,并根据比较器获取第一个或最后一个整数。然后它会将其转换为具有 Integer.valueOf(...)
的整数,并将使用默认整数比较内置 Integer1.compareTo(Integer2)
.
我遇到一个问题,我需要按升序或降序对由连字符分隔的整数进行排序。
我尝试使用
Collections.sort(list, Collections.reverseOrder());
其中 list
是 ArrayList
创建的一个实例,但它没有给我确切的结果。
arrayList 如下所示:
[91,95,96-1,94-2,94-1,100-2].
预期的方式是:
[91,94-1,94-2,95,96-1,100-2]
对字符串使用默认排序将使用字典顺序,而您打算按数字顺序对字符串进行排序(如果第一个数字相等,则按第二个数字排序)。实现此目的的一种方法是使用两个比较器:
List<String> list = new ArrayList<>(Arrays.asList("96-1","91","94-2","100-2","94-1","95"));
System.out.println("Unsorted: "+list);
Comparator<String> primaryComparator =
(a,b)->Integer.valueOf(a.split("-")[0])
.compareTo(Integer.valueOf(b.split("-")[0]));
Comparator<String> secondaryComparator =
(a,b)->Integer.valueOf(a.split("-")[1])
.compareTo(Integer.valueOf(b.split("-")[1]));
list.sort(primaryComparator.thenComparing(secondaryComparator));
System.out.println("Sorted: "+list);
list.sort(primaryComparator.thenComparing(secondaryComparator).reversed());
System.out.println("Sorted in reverse: "+list);
至于比较器本身,我假设列表中的字符串始终有效,并且始终采用 \d+(-\d+)?
形式,因此要么是一个整数,要么是两个用连字符分隔的整数。 (如果不是这种情况,您可能需要添加一些额外的 checks/validations 和自定义 Java 7 样式比较器,以使其比 Java 8 样式 lambda 更具可读性。)
.split("-")[0]
/ .split("-")[1]
将在连字符上拆分此字符串,并根据比较器获取第一个或最后一个整数。然后它会将其转换为具有 Integer.valueOf(...)
的整数,并将使用默认整数比较内置 Integer1.compareTo(Integer2)
.