【发布时间】:2016-02-23 08:16:05
【问题描述】:
我有一个整数值列表,我想在列表中找到最大的连续序列整数。
例如,令 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; }
提前致谢
【问题讨论】:
-
你有没有尝试过或者你希望有人能给你一个解决方案?
-
流对于此类问题是一个糟糕的选择。您正在寻找迭代列表,并为每个元素开始另一个迭代,以查看您拥有连续元素的距离。带有整数索引的 for 循环似乎更自然
-
这并不难。您只需对列表进行排序(如果未排序),迭代(检查位置
i+1中的元素是否等于位置i+ 1 -
这是一个使用我的 StreamEx 库的单线器:
StreamEx.of(1, 3, 4, 6, 7, 8, 10, 12, 13).groupRuns((a, b) -> b-a == 1).maxBy(List::size).orElse(Collections.emptyList()) -
查看这个gist 使用collect() 获得两个答案。如果这个问题没有(不公平地)关闭,我会回答。
标签: java java-8 java-stream