【发布时间】:2015-01-27 18:32:17
【问题描述】:
是的,我知道有很多关于同一问题的问题,但我似乎真的找不到我的比较器有什么问题。
所以,这里是:
evaluateComparator = (m1, m2) -> {
Color color = m1.getColor(); // m1 and m2 will have the same one
double m1Value, m2Value;
if (sortingCache.containsKey(m1)) {
m1Value = sortingCache.get(m1);
} else {
// The value has not been computed before so it's not in the cache and I need to compute it now
someClass.doSomething(m1);
m1Value = someClass.getValue();
someClass.undoSomething(m1);
sortingCache.put(m1, m1Value);
}
if (sortingCache.containsKey(m2)) {
m2Value = sortingCache.get(m2);
} else {
// The value has not been computed before so it's not in the cache and I need to compute it now
someClass.doSomething(m2);
m2Value = someClass.getValue();
someClass.undoSomething(m2);
sortingCache.put(m2, m2Value);
}
// Since I'm comparing two doubles I can use the Double's comparator
return Double.compare(m1Value, m2Value);
};
代码非常简单:我需要根据对象对我的主要结构的改变方式对它们进行排序,并且我希望首先获得最高值。
由于计算 m1 或 m2 对象的影响可能需要一些时间,我只是缓存值以便重用它们,所以在排序之前,我检查我是否有缓存值或者是否需要计算它。
一旦我计算出将m1 或m2 应用于我的结构的结果,我就会将更改还原。
您可以将其视为来自 AI 世界的某种评估排序: 我想根据我应用它们的棋盘分数对这些动作进行排序。
你对此有什么想法吗?
编辑: 由于可能涉及到一些涉及散列和缓存的奇怪事情,我删除了对缓存的所有引用,但我仍然遇到问题。
evaluateComparator = (m1, m2) -> {
double m1Value, m2Value;
someClass.doSomething(m1);
m1Value = someClass.getValue();
someClass.undoSomething(m1);
someClass.doSomething(m2);
m2Value = someClass.getValue();
someClass.undoSomething(m2);
return Double.compare(m1Value, m2Value);
};
【问题讨论】:
-
附带说明,如果您使用
Comparator.comparingDouble()组合器,您可以用一半的代码实现它。 -
没用过,能解释一下吗?
-
您只需提供从一个 Move 对象中提取值的函数。组合器返回完整的两参数比较函数(或者,从技术上讲,是 Comparator 函数接口的实现)。