首页 > 解决方案 > Java流将字符串列表排序为数字问题

问题描述

我在将 QuestionNumbers 列表排序为字符串时遇到问题。

List<String> list = Arrays.asList("12.2", "12.1", "12.3", "12.4", "12.5", "12.10");

List<String> sortedList = list.stream().sorted().collect(Collectors.toList());

当打印出 sortedList 我得到:

12.1
12.10
12.2
12.3
12.4
12.5

我尝试了以下但得到多点错误。请帮忙

.sorted(Comparator.comparingDouble(question ->(Double.parseDouble(question.getQuestionNumber()))  ))

标签: javasortingjava-stream

解决方案


String.compareTo 按字典顺序比较字符串。在这种比较中,数字只是字符,与字母或标点符号或表情符号没有什么不同。

您需要一个能够识别nn的 Comparator 。nn格式。您可以编写一个新的比较器,但更易于管理的方法是拥有一个解析此类字符串的类。

如果您使用的是 Java 9 或更高版本,那么您很幸运:已经有这样一个类。该类是Runtime.Version

因此,您可以通过比较它们各自的 Runtime.Version 等效项来对字符串进行排序,然后将已排序的对象转换回字符串:

List<String> sortedList =
    list.stream().map(Runtime.Version::parse).sorted()
    .map(Object::toString).collect(Collectors.toList());

推荐阅读