我有一个整数值列表,我希望在列表中找到最大的连续序列整数。
例如,设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将两张卡片的价值进行比较:
私有布尔isSequentialCards(Card c1,Card c2) { if((c1.getNumber() == c2.getNumber() - 1))返回真;返回false;}
提前感谢
发布于 2015-12-02 22:07:24
我能用溪流做的最好的事:
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或收集器时,很难进行维护,特别是在这里只使用一行代码(个人选择,我希望我的代码能够被任何人维护)。
https://stackoverflow.com/questions/33833521
复制相似问题