[英]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();
我在另一个答案中找到了有关收藏家的信息。 其余的全部来自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.