在Scala中使用Array [Boolean]来查找foreach的进度

时间:2016-01-15 12:30:12

标签: arrays scala

我在Scala中有一个类,它有一个方法在构造函数中提供的列表上使用foreach顺序执行一堆计算。该类有一个字段val progress: Array[Boolean] = list.map(_ => false).toArray。其中一些计算可能需要很长时间,所以在每个计算结束时,我在progresstrue中设置了适当的索引。然后我可以progress来确定我在课外的计算中的位置。

这似乎不是Scala中最好的方法(因为我使用的是可变数据结构)所以任何改进它的建议都会非常感激。

2 个答案:

答案 0 :(得分:0)

嗯,这取决于你想要对这些信息做些什么。如果您对特定事件感兴趣(例如,50%完成或类似事件),您可以将监听器传递给您的foreach方法并要求收到通知。但如果你真的需要随时询问当前的状态,那么......好吧,如果你需要知道状态,那么你必须保持状态,没有办法解决这个问题:)

一些布尔值似乎是一种矫枉过正(你可以保留当前的索引),但你提到你还计划保留其他信息,所以看起来很合理。

答案 1 :(得分:0)

我认为你的做法不好。另一种方法是使用var progress: List[Boolean]作为不可变数据结构,并具有该变量指向的一长列不可变列表。你没有真正获得任何东西,你失去了在一步中保留你需要的确切内存的能力,而内存分配会使速度变慢。

存在可变数据结构存在的原因,这是因为它们非常有用且非常需要,与您仍然可以定义var而非val的原因相同,重要的不是那个一个是"坏"而另一个好的",这是一个知道何时可以使用val并牺牲可变性以换取安全性的问题。在你的例子中,你不能。

旁注:而不是使用

val progress: Array[Boolean] = list.map(_ => false).toArray

这更加清晰和快速恕我直言:

val progress = Array.fill(list.size)(false)