【发布时间】:2013-11-21 10:41:24
【问题描述】:
我有一个项目列表,我为每个项目计算一个值。计算这个值有点计算密集,所以我想尽可能地减少它。
我需要实现的算法是这样的:
我有一个值 X
-
每个项目
一个。计算它的值,如果它是
b. if (值 > 0) && (值
返回 List 中的所有 (item, value) 对(值 > 0),理想情况下按值排序
为了更清楚一点,第 3 步仅在没有任何项的值小于 X 的情况下发生。在第 2 步中,当我们遇到第一个小于 X 的项时,我们不应该计算其余项并返回该项目(我们显然可以在 Set() 中单独返回它以匹配返回类型)。
我目前的代码如下:
val itemValMap = items.foldLeft(Map[Item, Int)]()) {
(map : Map[Item, Int], key : Item) =>
val value = computeValue(item)
if ( value >= 0 ) //we filter out negative ones
map + (key -> value)
else
map
}
val bestItem = itemValMap.minBy(_._2)
if (bestItem._2 < bestX)
{
List(bestItem)
}
else
{
itemValMap.toList.sortBy(_._2)
}
但是,此代码所做的是计算列表中的所有值并选择最佳值,而不是在找到“更好”的值时停止。我怀疑我必须以某种方式使用 Streams 来实现这一点?
【问题讨论】:
-
Patryk Ćwiek 和 Régis Jean-Gilles 的两种解决方案都运行良好。出于某种原因,在我的场景中,选择的答案表现得更好一些,但这可能取决于我对程序其余部分的实现,或者
Stream如何发挥其内部魔力(我没有单独测试两者) .不幸的是,我只能选择一个答案。如果您正在寻找类似的解决方案,请尝试两者,看看哪种方案最适合您的方案。