为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Qyouu 2023-05-24 15:00:58
我有一个问题,我需要按升序或降序对由连字符分隔的整数进行排序。我尝试使用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]
查看完整描述

1 回答

?
慕仙森

TA贡献1827条经验 获得超7个赞

对字符串使用默认排序将使用字典顺序,而您打算按数字顺序对字符串进行排序(如果第一个数字相等,则按第二个数字排序)。实现此目的的一种方法是使用两个比较器:


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


查看完整回答
反对 回复 2023-05-24
  • 1 回答
  • 0 关注
  • 145 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信