繁体   English   中英

如何使用 sorted(comparator) 方法按字典顺序排序?

[英]How do I sort lexicographically with sorted(comparator) method?

我有这个函数可以按数字顺序对我的数据行进行排序,但问题是它排序的键由字母和数字组成:

void writeData(Map<String, Params> data) {
    .
    .
    StringBuilder sb = new StringBuilder();
    data.values()
        .stream()
        .sorted(Comparator.comparing(Params::getIdx))
        .forEach(r -> {
            sb.append(System.lineSeparator());
            sb.append(r.getCSVRow());
        });
    .
    .
}

例如,我有字符串: "A100","A101", "A99"

我得到的订单:

A100
A101
A99

我要的顺序:

A99
A100
A101

如何更改此功能? 由于某种原因,我没有使用thenCompare的选项。 (虽然我已经读过它)。

按照字典顺序,这是正确的排序,因为字符9位于字符1 您应该将这些字符串拆分为非数字和数字部分,并分别对它们进行排序:数字作为数字,字符串作为字符串。 排序后,您可以将这些部分连接回一个字符串并获得一个排序数组。 例如:

// assume a string consists of a sequence of
// non-numeric characters followed by numeric characters
String[] arr1 = {"A100", "A101", "A99", "BBB33", "C10", "T1000"};
String[] arr2 = Arrays.stream(arr1)
        // split string into an array of two
        // substrings: non-numeric and numeric
        // Stream<String[]>
        .map(str -> str
                // add some delimiters to a non-empty
                // sequences of non-numeric characters
                .replaceAll("\\D+", "$0\u2980")
                // split string into an array
                // by these delimiters
                .split("\u2980"))
        // parse integers from numeric substrings,
        // map as pairs String-Integer
        // Stream<Map.Entry<String,Integer>>
        .map(row -> Map.entry(row[0], Integer.parseInt(row[1])))
        // sort by numbers as numbers
        .sorted(Map.Entry.comparingByValue())
        // intermediate output
        //C=10
        //BBB=33
        //A=99
        //A=100
        //A=101
        //T=1000
        .peek(System.out::println)
        // join back into one string
        .map(entry -> entry.getKey() + entry.getValue())
        // get sorted array
        .toArray(String[]::new);
// final output
System.out.println(Arrays.toString(arr2));
// [C10, BBB33, A99, A100, A101, T1000]

也可以看看:
我如何将一个数组输入与另一个相关联?
如何从数组或列表中删除两个元素的序列?

解析出数字:

Comparator.comparingInt(v -> Integer.parseInt(v.substring(1))

(假设前缀总是 1 个字符)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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