3 回答
TA贡献2051条经验 获得超10个赞
你可以记住这个e -> minimax(e)函数:
public static <T, S> Function<T, S> memoize(Function<T, S> function) {
Map<T, S> cache = new HashMap<>();
return argument -> cache.computeIfAbsent(argument, function);
}
然后,只需使用 memoized 函数:
GameState bestGs = Collections.max(ns,
Comparator.comparing(memoize(e -> minimax(e))));
编辑:这种方法需要GameState实现hashCode和equals 一致。这些方法也应该运行得非常快(这是通常的情况)。
编辑 2:正如 M. Justin 在下面的评论中所说,这个解决方案不是线程安全的。如果要从多个线程使用记忆化函数,则应使用 aConcurrentHashMap而不是 a HashMap。
TA贡献1816条经验 获得超6个赞
import java.util.ArrayList;
import java.util.List;
import static java.lang.Integer.MIN_VALUE;
import static java.util.AbstractMap.SimpleEntry;
...
var bestEntry = ns.stream()
.map(i -> new SimpleEntry<>(i, minimax(i)))
.max(Map.Entry.comparingByValue())
.orElse(new SimpleEntry<>(null, MIN_VALUE));
var bestGameState = bestEntry.getKey();
var bestScore = bestEntry.getValue();
减少后,您将得到一个Optional<Pair<GameState, Integer>>可能包含最高minimax结果和相应的GameState. 如果没有游戏状态,我们返回默认条目new SimpleEntry<>(null, MIN_VALUE)。
TA贡献1883条经验 获得超3个赞
GameState max = ns.stream()
.collect(Collectors.toMap(str -> minimax(str), Function.identity(), (gs1, gs2) -> gs1,
(Supplier<Map<Integer, GameState>>)() -> new TreeMap<>(Comparator.reverseOrder())
)).values().iterator().next();
添加回答
举报