2016-10-12 2 views
2

類似しているが必ずしも同一ではないコンテンツを持つ2つのストリームがあるとします。 2人の間で異なる最初のアイテムを見つけるにはどうすればいいですか?たとえば、私が持っていると仮定すると:Javaストリーム:2つのストリームで異なる最初のアイテムを見つける

Stream<String> first = Arrays.asList("a", "b", "c").stream(); 
Stream<String> second = Arrays.asList("a", "x", "c").stream(); 

「b」と「x」がストリームが異なる最初の項目であると判断するにはどうすればよいですか?ストリームの1つが切り捨てられた場合はどうなりますか?

+0

ストリーム全体を消費したり、これらを一緒にマージして、このようなことを理解している可能性があります。コレクションの代わりにストリームがある特定の理由はありますか?すなわち、あなたが作業しているデータのサイズを知っていますか?これは特定の特定のサイズであることが保証されていますか? – Makoto

+0

ストリームを注文することはできますが、概念的にはストリームを順序付けられていないと考えることが最善です。順序の欠如は並列化を可能にする。あなたが実行したい操作は、 'Iterator'や' Iterable'に 'Stream'よりも適しています。 –

+0

データを並べ替えるとき(SortedSetから来たときなど)は、データを並べ替えたり、ストリームの並べ替え操作を使用してデータを並べ替えることを計画していたので、ストリームで作業したいと思っていました。ソースが 'HashSet'または' TreeSet'インスタンスのいずれかである場合、効率的に動作する別の方法がある場合は、このようにしてうれしいです。 –

答えて

5

これはストリームがあなたにとって有用な何かをすることができるユースケースではありません。ストリームをIteratorに変換し、それらをより伝統的なスタイルで比較したり、ストリームを最初に使用したりするよりも優れたこの操作を行うための組み込みの方法はありません。イテレータが外上で動作し、一方、より伝統的に、2 Collection秒で、私は

Iterator<String> itr1 = collection1.iterator(); 
Iterator<String> itr2 = collection2.iterator(); 
for (int i = 0; itr1.hasNext() && itr2.hasNext(); i++) { 
    if (!itr1.next().equals(itr2.next())) { 
    System.out.println(i); 
    break; 
    } 
} 
+0

ストリーム*は、データソースがすでにソートされていると効率を落とすことなくソートされたデータソースを得ることができるので便利です*しかし、イテレータを使って比較を実行する方が簡単です。幸いにも、私はストリームからイテレータを得ることができるので、データを消費するためにイテレータベースのコードを使用できますが、ストリームAPIを使用して最初にソートされたイテレータを取得します。 –

3

を書きたいストリームは、データの内に動作することを行うには

。 2つのウォーク(ストリームまたはイテレータ)を使用する場合、少なくとも1つは外側にある必要があります。

最初のラムダごとに2番目のストリームを作成する必要があります。

両方のストリームが同じ順序を維持している場合、フルストリームソリューションが可能です。以下のようなビット:

あなたは2つのランナブルのスレッドを作成
EqualTester tester = new EqualTester(
    () -> list1.stream().allMatch(x -> tester.queueAndWait(x)), 
    () -> list2.stream().allMatch(x -> tester.queueAndWait(x)) 
); 
boolean eq = tester.getFuture(); 

は、「比較入力」であり、真/偽の両方の入力でその場その次の値が得られましたさ。

実行可能ですが、単純なアルゴリズムが裏返しになっています。面接の質問のための何か。

関連する問題