繁体   English   中英

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

[英]Collect the largest successive sequence integers in a list using streams

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

例如,令L为以下整数列表:

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

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

6、7、8

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

是否可以使用Java 8中的流来实现?

到目前为止,这是我在Java中使用简单迭代得到的结果:

    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通过其值比较两张卡片:

 private boolean isSequentialCards(Card c1, Card c2) { if((c1.getNumber() == c2.getNumber() - 1)) return true; return false; } 

提前致谢

最好我可以使用流:

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();

有哪些步骤:

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

怎么样 ?

  • sorted :之所以发表评论,是因为我不知道您是否想要列表顺序中的最大序列,或者不建议使用@ cr0ss。 它基本上按从小到大的升序对列表进行排序。
  • collect :您可以在其中查看Collector提供的三个“操作”(例如Collectors.toList)。 这是找到连续数字序列的所有魔术的地方。 此实现尝试收集连续数字的序列列表(也是列表)。
    • 供应商 :初始化容器:卡片列表(卡片序列列表)。
    • 累加器 :是什么使得要在序列中插入一个数字(在下一部分中描述)。
    • Combiner :定义如何合并两个列表。 不使用但需要,基本的addAll就足够了。
  • 排序 :从最大到最小顺序排序
  • findFirst :首先,因此最大

我在另一个答案中找到了有关收藏家的信息。 其余的全部来自Java文档。

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

给定列表3、4、6没有序列,请创建一个新序列。

[] -> [[]]

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

[[]] -> [[3]]

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

[[3]] -> [[3, 4]]

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

[[3, 4]] -> [[3, 4], []]

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

[[3, 4], []] -> [[3, 4], [6]]

就像@Manos所说,流是解决此问题的奇怪选择。 我认为问题在于,当您不习惯流式传输,lambda或收集器时,尤其是像此处这样的单行代码(个人选择,我希望我的代码可由任何人维护)时,很难维护。

暂无
暂无

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

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