了解Scala中Iterator.iterate期间的takeWhile终止条件

时间:2018-12-28 05:35:35

标签: scala

我很难理解为什么这段代码看起来早就终止了:

item

它返回object intersectionDemo { val arr = Array(2, 4, 7, 8, 12, 20) val arr2 = Array(3, 4, 8, 9, 11, 20) Iterator.iterate((arr, arr2, List[Int]())) { case (one, two, res) => if (one.head == two.head) (one.tail, two.tail, one.head :: res) else if (one.head > two.head) (one, two.tail, res) else (one.tail, two, res) }.takeWhile { case (a, b, _) => a.nonEmpty && b.nonEmpty } .toList.last._3.reverse } ,尽管它应该返回List(4, 8),如果我在这里检查第一个或第二个数组:List(4, 8, 20)_._1,我得到_._2。我确实知道还有其他方法可以解决两个数组的交集问题,但对于为什么不插入最后一个元素,我有点困惑。

我的猜测是,它看到Array(20)one.tailtwo.tail并终止了迭代,但是empty是否不应该插入?

1 个答案:

答案 0 :(得分:3)

考虑一下。 (我正在使用<a href="/?action=edit&id=<?php echo $row['id'] ?>">EDIT <?php echo $row['first_name'].' '.$row['last_name'] ?></a> 语法来演示List的状态,但是您明白了。)

Array

// 20::Nil 20::Nil (Nil, Nil, 20 :: 8 :: 4 :: Nil) if (one.head == two.head) (one.tail, two.tail, one.head :: res) 被插入 20one都被清空,因此,如果您two都不为空,则说明尚未插入

如果将其更改为takeWhile,则会得到所需的结果。