基于java

时间:2017-07-06 05:31:54

标签: java java-8 java-stream

我想对元素进行排序并按如下方式对它们进行分组,如何使用java流排序,分组和分区来实现它。

输入是在流中进行的,这意味着在获得以下输入之后,像A16,17这样的输入可能会到来,数据结构必须重新组织并重新组合。

输入A10,A4,A11,A3,A12,A15 .... B19,B2,B20 ......

输出A3-A4,A10-A12,A15,B2,B19-B20。

我可以按如下排序

array.sort(Comparator   .comparing(...)
                                .thenComparing(Comparator.comparing(...)));

但不确定如何使用流以最优化的方式对chaning输入进行分区和重组。

 array.stream().collect(Collectors.partitionBy(...))

为了实现串行顺序分组,上面的分区功能逻辑应该是什么?

1 个答案:

答案 0 :(得分:1)

如果您使用Java8 Comparator界面编写自己的Collector和自己的Stream,则可以轻松完成:

array.stream().sorted(new MyComparator()).collect(new MyCollector());

Comparator很容易写:

class MyComparator implements Comparator<String> {

    @Override
    public int compare(String s1, String s2) {
        if(s1.substring(0, 1).compareTo(s2.substring(0,1)) < 0) {
            return -1;
        } else if (s1.substring(0, 1).compareTo(s2.substring(0,1)) > 0) {
            return 1;
        } else { //first char is equal
            if(Integer.parseInt(s1.substring(1, s1.length())) < Integer.parseInt(s2.substring(1, s2.length()))) {
                return -1;
            } else if (Integer.parseInt(s1.substring(1, s1.length())) > Integer.parseInt(s2.substring(1, s2.length()))) {
                return 1;
            }
        }
        return 0;
    }
}

它基本上检查开头的字母,然后检查数字。尝试使用自然字母顺序会将A10, A11 ...放在A2,A3 ...之前,因为1<2

我离开Collector故意不成文,因为这是一个有趣的练习。

但是如果你不想使用Collector,因为你发现它太难了,你总是可以使用新订的List来逐个抓取它的元素并创建另一个{{1}包含您要查找的结果。