第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

具有昂貴自定義鍵功能的列表的最大值

具有昂貴自定義鍵功能的列表的最大值

繁星點點滴滴 2021-10-13 10:59:57
在 Java 中查找您編寫的序列的最大元素:GameState bestGs = Collections.max(ns,        Comparator.comparing(e -> minimax(e)));這minimax是一個返回數(shù)字的函數(shù),它ns是一個集合。代碼有效,但是對于集合的每個元素,關(guān)鍵函數(shù)將被評估不止一次。我如何制作它以便每個元素只評估一次?在 Python 中你只會寫max(seq, key = lambda e: minimax(e))Java 中一定有類似的東西嗎?不要告訴我自己寫forloop,這是我不應(yīng)該寫的21世紀(jì)!顯式循環(huán)代碼如下: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 中以“函數(shù)式”方式編寫上述內(nèi)容,但也要保留高性能。
查看完整描述

3 回答

?
侃侃無極

TA貢獻2051條經(jīng)驗 獲得超10個贊

你可以記住這個e -> minimax(e)函數(shù):


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 函數(shù):


GameState bestGs = Collections.max(ns,

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

編輯:這種方法需要GameState實現(xiàn)hashCode和equals 一致。這些方法也應(yīng)該運行得非常快(這是通常的情況)。


編輯 2:正如 M. Justin 在下面的評論中所說,這個解決方案不是線程安全的。如果要從多個線程使用記憶化函數(shù),則應(yīng)使用 aConcurrentHashMap而不是 a HashMap。


查看完整回答
反對 回復(fù) 2021-10-13
?
瀟湘沐

TA貢獻1816條經(jīng)驗 獲得超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結(jié)果和相應(yīng)的GameState. 如果沒有游戲狀態(tài),我們返回默認(rèn)條目new SimpleEntry<>(null, MIN_VALUE)。


查看完整回答
反對 回復(fù) 2021-10-13
?
白板的微信

TA貢獻1883條經(jīng)驗 獲得超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();


查看完整回答
反對 回復(fù) 2021-10-13
  • 3 回答
  • 0 關(guān)注
  • 132 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號