猿问

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


Qyouu
浏览 146回答 1
1回答

慕仙森

对字符串使用默认排序将使用字典顺序,而您打算按数字顺序对字符串进行排序(如果第一个数字相等,则按第二个数字排序)。实现此目的的一种方法是使用两个比较器: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+)?,因此要么是一个整数,要么是两个用连字符分隔的整数。(如果不是这种情况,您可能需要使用自定义 Java 7 样式比较器添加一些额外的检查/验证,以使其比 Java 8 样式的 lambda 更具可读性。)/.split("-")[0]将.split("-")[1]在连字符上拆分此字符串,并根据比较器获取第一个或最后一个整数。然后它会将其转换为带有 的整数Integer.valueOf(...),并将使用内置的默认整数进行比较Integer1.compareTo(Integer2)。
随时随地看视频慕课网APP

相关分类

Java
我要回答