是否可以交换集合中的两个元素?

Is it possible to swap two elements in a collection?

让一个不可变的集合(例如Seq);我想交换一些元素("some" = 如果某些条件得到验证)。

从概念上讲,有两种情况:

  1. 交换是在原始集合的副本上完成的,因此它不依赖于先例交换。

  2. 交换是在原始集合的副本上完成的 - 用于交换的副本 - 因此它取决于先例交换。

第一种情况是最简单的。事实上,我们需要 map,验证处理元素的条件,我们将其替换为另一个:my_collection.map(current_element => { if(...) { another_element } else { current_element }})。注意:可以使用其他条件,具体取决于确定每个交换的条件。

最后一个案例比较困难:我需要处理集合的当前状态。 你知道这是否可能吗?

唯一现实的方法是重复应用案例 1,直到没有更多的交换要应用。

您首先需要修改案例 1 以在原始集合上使用 foldLeft 操作,returns 一个包含新集合的元组和一个 boolean 指示是否执行了任何交换.

然后将其包装在应用此操作的递归函数中,然后 returns 如果没有发生交换则使用新集合,或者如果至少发生一次交换则使用新集合递归调用自身。

您可能还需要检查无限递归,以防 "swap" 操作将集合更改回以前的值之一。