为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

繁星点点滴滴 2021-10-13 10:59:57
在 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 中以“函数式”方式编写上述内容,但也要保留高性能。
查看完整描述

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。


查看完整回答
反对 回复 2021-10-13
?
潇湘沐

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)。


查看完整回答
反对 回复 2021-10-13
?
白板的微信

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();


查看完整回答
反对 回复 2021-10-13
  • 3 回答
  • 0 关注
  • 114 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信