繁体   English   中英

Java流将字符串列表排序为数字问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM