对 Java 中具有特殊字符的整数进行排序

Sort integers having special character in Java

我遇到一个问题,我需要按升序或降序对由连字符分隔的整数进行排序。

我尝试使用

Collections.sort(list, Collections.reverseOrder());

其中 listArrayList 创建的一个实例,但它没有给我确切的结果。

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);

Try it online.

至于比较器本身,我假设列表中的字符串始终有效,并且始终采用 \d+(-\d+)? 形式,因此要么是一个整数,要么是两个用连字符分隔的整数。 (如果不是这种情况,您可能需要添加一些额外的 checks/validations 和自定义 Java 7 样式比较器,以使其比 Java 8 样式 lambda 更具可读性。)

.split("-")[0] / .split("-")[1] 将在连字符上拆分此字符串,并根据比较器获取第一个或最后一个整数。然后它会将其转换为具有 Integer.valueOf(...) 的整数,并将使用默认整数比较内置 Integer1.compareTo(Integer2).