首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java中基于动态串行有序输入流的数据排序与分割

java中基于动态串行有序输入流的数据排序与分割
EN

Stack Overflow用户
提问于 2017-07-06 13:31:54
回答 1查看 181关注 0票数 4

我想按如下方式对元素进行排序和分组,如何使用java streams sort、group和partition by来实现这一点。

输入是以流的形式出现的,这意味着在获得下面的输入之后,可能会有A16,17这样的输入出现,数据结构必须重新组织和重组。

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

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

我可以按如下方式进行排序

代码语言:javascript
复制
array.sort(Comparator   .comparing(...)
                                .thenComparing(Comparator.comparing(...)));

但不确定如何分区和重组,以便以最优化的方式使用流来更改输入。

代码语言:javascript
复制
 array.stream().collect(Collectors.partitionBy(...))

为了实现序列顺序分组,上面的partition by的函数逻辑应该是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-06 14:20:44

如果您使用Java8 Stream接口编写自己的ComparatorCollector,就可以很容易地做到这一点:

代码语言:javascript
复制
array.stream().sorted(new MyComparator()).collect(new MyCollector());

Comparator非常容易编写:

代码语言:javascript
复制
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来两个接一个地获取它的元素,并创建另一个包含您要查找的结果的List

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44940479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档