基于java中的动态串行有序输入流对数据进行排序和分区

我想对元素进行排序并将它们分组如下,如何使用
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(...))

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

最佳答案 如果您编写自己的Comparator和自己的Collector,可以轻松完成,使用Java8 Stream接口:

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

比较器很容易写:

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. 我离开收藏家故意不为你做这个部分,因为这是一个有趣的练习. 但是如果您不想使用收集器,因为您觉得它太难了,您可以始终使用新排序的List来逐个抓取它的元素,并创建另一个包含您要查找的结果的List.

点赞