[英]Java stream sorting a List of String as numbers problem
我在将 QuestionNumber 列表排序为字符串时遇到问题。
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())) ))
String.compareTo 按字典顺序比较字符串。 数字只是这种比较中的字符,与字母或标点符号或表情符号没有区别。
您需要一个能够识别nn的比较器。 n格式。 您可以编写一个新的 Comparator,但更易于管理的方法是拥有一个解析此类字符串的类。
如果您使用的是 Java 9 或更高版本,那么您很幸运:已经有这样的类了。 该类是Runtime.Version 。
因此,您可以通过比较它们各自的 Runtime.Version 等效项来对字符串进行排序,然后将排序后的对象转换回字符串:
List<String> sortedList =
list.stream().map(Runtime.Version::parse).sorted()
.map(Object::toString).collect(Collectors.toList());
正如注释中所写:您可以首先按长度组合两个Comparator
,然后按String
值。
list.stream()
.sorted(Comparator
.comparing(String::length)
.thenComparing(String::compareTo))
.collect(Collectors.toList());
正如 Holger 所写,上述方法存在一些问题。 可以改写如下:
list.stream()
.sorted(Comparator.comparing((String s) -> s.split("\\."),
Comparator
.comparing((String[] a) -> Integer.parseInt(a[0]))
.thenComparingInt((a) -> a.length > 1 ? Integer.parseInt(a[1]) : 0))
)
.collect(Collectors.toList());
但它看起来更复杂,它的做法或多或少与VGR提出的相同。 所以最后你可以这样写:
list.stream()
.sorted(Comparator.comparing(Runtime.Version::parse))
.collect(Collectors.toList());
您正在对字符串进行排序,如果要对字符串进行排序,则结果是正确的。 但在您的情况下,您应该将其转换为 float、double、Double 或 BigDecimal ...
试试这个代码:
List list = Arrays.asList("12.2", "12.1", "12.3", "12.4", "12.5", "12.10");
List sortedList = list.stream()**.map(Double::valueOf)**.sorted().collect(Collectors.toList());
转换此值,您将获得正确的数字顺序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.