首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用流收集列表中最大的连续序列整数。

使用流收集列表中最大的连续序列整数。
EN

Stack Overflow用户
提问于 2015-11-20 18:23:24
回答 1查看 1.3K关注 0票数 0

我有一个整数值列表,我希望在列表中找到最大的连续序列整数。

例如,设L为下列整数列表:

L= {1、3、4、6、7、8、10、12、13}

然后,我只想从流中收集以下整数:

6、7、8

因为这些数字是列表L中最大的连续序列整数。

是否可以使用Java 8中的流来完成它?

到目前为止,我已经在Java中使用了简单的迭代:

代码语言:javascript
复制
    int maxSeqSize = 0;
    List<Cards> maxSeq;
    int currentNumber;
    int startSeq = -1;

    List<Card> currentCards = new ArrayList<> Cards.getCards());
    Collections.sort(currentCards, Cards::CompareByNumber);

    for (currentNumber = 0; currentNumber< Cards.getCards().size() - 1; currentNumber++){
           if((isSequentialCards(Cards.getCards().get(currentNumber ),
                                Cards.getCards().get(currentNumber + 1)))) {
            if (startSeq == -1) 
               startSeq = currentNumber ;

           }
           else {
             if(startSeq > 0 && currentNumber - startSeq + 1 >= maxSeqSize ) 
             {                                        
                  maxSeqSize = currentNumber - startSeq + 1;
                  maxSeq = currentCards .subList(startSeq,currentNumber +1);
             }
                    startSeq = -1;
           }
      }

      return maxSeq;

而isSequentialCards将两张卡片的价值进行比较:

私有布尔isSequentialCards(Card c1,Card c2) { if((c1.getNumber() == c2.getNumber() - 1))返回真;返回false;}

提前感谢

EN

回答 1

Stack Overflow用户

发布于 2015-12-02 22:07:24

我能用溪流做的最好的事:

代码语言:javascript
复制
List<Card> largestSequence = cards.stream()
            //.sorted((card1, card2) -> card1.getNumber() - card2.getNumber())
            .collect(
                    (Supplier<List<List<Card>>>) ArrayList::new,
                    (sequences, currentCard) -> {
                        if (sequences.size() == 0 || !isSequentialCards(getLast(getLast(sequences)), currentCard)) {
                            sequences.add(new ArrayList<>());
                        }
                        getLast(sequences).add(currentCard);
                    },
                    List::addAll)
            .stream()
            .sorted((sequence1, sequence2) -> sequence2.size() - sequence1.size())
            .findFirst()
            .get();

有哪些步骤:

  • 查找所有的连续数序列
  • 从最大到最小的顺序序列
  • 得到第一个序列(最大)

怎么做到的?

  • 排序:这是我评论的,因为我不知道您想要列表顺序中最大的序列,还是像@cr0ss建议的那样。它基本上将列表按升序排列,从最小的数到最大的。
  • 收集:在其中,您可以看到收集器可以提供的三个“操作”(如Collectors.toList)。在这里,找到一个连续数字序列的神奇之处就发生了。此实现试图收集连续数字的序列列表(也是列表)。:
    • 供应商:初始化容器:卡片列表(卡片序列列表)。
    • 累加器:是什么使一个数字被插入到一个序列中(在下一部分中描述)。
    • 组合器:定义如何合并两个列表。没有使用但需要,基本的addAll就足够了。

  • 排序:将序列从最大到最小排序
  • findFirst :采取第一,因此最大的

我在另一个答案中找到了关于收藏家的信息。其余部分都来自java文档。

是什么使数字成为序列的一部分?

给定一个列表3,4,6不存在序列,创建一个新序列。

代码语言:javascript
复制
[] -> [[]]

在最后一个序列的末尾插入3。

代码语言:javascript
复制
[[]] -> [[3]]

至少存在一个序列,并且4连续于3,最后一个序列的最后一个数。在最后一个序列的末尾插入4。

代码语言:javascript
复制
[[3]] -> [[3, 4]]

一个序列存在,但6不连续于4,即最后一个序列的最后一个数。创建一个新的序列。

代码语言:javascript
复制
[[3, 4]] -> [[3, 4], []]

在最后一个序列的末尾插入6。

代码语言:javascript
复制
[[3, 4], []] -> [[3, 4], [6]]

就像Manos说的,流是解决这个问题的一个奇怪的选择。我认为问题在于,当您不习惯使用流、lambda或收集器时,很难进行维护,特别是在这里只使用一行代码(个人选择,我希望我的代码能够被任何人维护)。

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

https://stackoverflow.com/questions/33833521

复制
相关文章

相似问题

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