具有昂贵自定义键功能的列表的最大值

在 Java 中查找您编写的序列的最大元素:


GameState bestGs = Collections.max(ns,

        Comparator.comparing(e -> minimax(e)));

这minimax是一个返回数字的函数,它ns是一个集合。代码有效,但是对于集合的每个元素,关键函数将被评估不止一次。我如何制作它以便每个元素只评估一次?在 Python 中你只会写max(seq, key = lambda e: minimax(e))Java 中一定有类似的东西吗?不要告诉我自己写forloop,这是我不应该写的21世纪!


显式循环代码如下:


GameState best = null;

// Doesn't matter what scalar type is used.

int bestScore = Integer.MIN_VALUE;  

for (GameState n : ns) {

    int thisScore = minimax(n);

    if (thisScore > bestScore) {

        bestScore = thisScore;

        best = n;

    }

}

我想在 Java 中以“函数式”方式编写上述内容,但也要保留高性能。


繁星点点滴滴
浏览 115回答 3
3回答

侃侃无极

你可以记住这个e -> minimax(e)函数:public static <T, S> Function<T, S> memoize(Function<T, S> function) {&nbsp; &nbsp; Map<T, S> cache = new HashMap<>();&nbsp; &nbsp; return argument -> cache.computeIfAbsent(argument, function);}然后,只需使用 memoized 函数:GameState bestGs = Collections.max(ns,&nbsp; &nbsp; Comparator.comparing(memoize(e -> minimax(e))));编辑:这种方法需要GameState实现hashCode和equals 一致。这些方法也应该运行得非常快(这是通常的情况)。编辑 2:正如 M. Justin 在下面的评论中所说,这个解决方案不是线程安全的。如果要从多个线程使用记忆化函数,则应使用 aConcurrentHashMap而不是 a HashMap。

潇湘沐

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()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .map(i -> new SimpleEntry<>(i, minimax(i)))&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .max(Map.Entry.comparingByValue())&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .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)。

白板的微信

GameState max = ns.stream()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.collect(Collectors.toMap(str -> minimax(str), Function.identity(), (gs1, gs2) -> gs1,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(Supplier<Map<Integer, GameState>>)() -> new TreeMap<>(Comparator.reverseOrder())&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;)).values().iterator().next();
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java