设一个不可变的集合(例如Seq
);我想交换一些元素(“some”=如果某些条件得到验证)。
从概念上讲,有两种情况:
交换是在原始集合的副本上完成的,因此它不依赖于先前的交换。
交换是在原始集合的副本上完成的 - 用于交换的副本 - 因此它取决于先例交换。
第一种情况是最简单的一种情况。实际上,我们需要map
,验证已处理元素的条件,然后我们将其替换为另一个:my_collection.map(current_element => { if(...) { another_element } else { current_element }})
。注意:可以使用其他条件,具体取决于确定每次交换的条件。
最后一种情况比较困难:我需要处理集合的当前状态。 你知道是否可能吗?
答案 0 :(得分:1)
唯一可行的方法是重复应用案例1,直到不再应用交换为止。
首先需要修改案例1,对原始集合使用foldLeft
操作,该集合返回包含新集合的元组,并指示是否执行了交换的boolean
。
然后将此包装在应用此操作的递归函数中,如果没有发生交换则返回新集合,或者如果至少发生一次交换,则使用新集合递归调用自身。
如果"交换&#34>,您可能还需要检查无限递归。操作将集合更改回以前的值之一。