【发布时间】:2016-12-30 23:29:20
【问题描述】:
此方法接受一个所有值都等于 null 的 Map,并返回一个具有相同键的 SortedMap,带有新值(通过 objectiveFitness 获得)
步骤 1. 首先,我从输入 Map 中取出键,并用相同的键构造一个新的 HashMap,新的值是objectiveFitness(key)。
public SortedMap<Integer[], Integer> evaluate(Map<Integer[], Integer> population, Integer[] melody, Integer[] mode) {
Map<Integer[], Integer> fitPop = new HashMap<>();
fitPop = population.keySet() //you just have the keys.
.stream()
.collect(Collectors.toMap(p -> p, p -> this.objectiveFitness(p)));
第 2 步。下一步是使用 Stream 将 HashMap 中的所有条目收集到具有自定义 Comparator 的 SortedMap 中。
从 Oracle 网站阅读此内容后:http://docs.oracle.com/javase/tutorial/collections/interfaces/order.html
...我发现,由于我想根据条目的自然顺序以外的其他内容来维护 SortedMap 的排序性,因此我需要实现一个包含 2 个部分的 Comparator。我将根据适应度值进行排序,使用键来比较唯一性。 *另外,我想要 2 个值可以相似的情况,但我不想
其中一部分与排序有关,并根据值返回(1,0 或 -1)。比较器的另一部分与唯一性有关(因为地图不允许重复。这是迄今为止我最好的镜头,但我很挣扎。
Comparator<Map.Entry<Integer[], Integer>> fitnessOrder =
new Comparator<Map.Entry<Integer[], Integer>>() {
public int compare(Map.Entry<Integer[], Integer> m1, Map.Entry<Integer[], Integer> m2) {
int fitCmp = m2.getValue().compareTo(m1.getValue());
if (fitCmp != 0)
return fitCmp;
if(m1.getKey().equals(m2.getKey())) return 0;
for(int i = 0; i < m1.getKey().length; i++){
if(m1.getKey()[i] > m2.getKey()[i]){
return 1;
}
if(m1.getKey()[i] < m2.getKey()[i]){
return -1;
}
}
return 0;
}
};
这看起来与equals一致吗?我真的不知道如何实现它。
如果正确,我想使用上面的 Comparator 来帮助我使用 lambdas 收集到 TreeMap,但是我只是一遍又一遍地卡住。
我也看了:Java TreeMap Comparator 我看到了有关基于键对 SortedMap 进行排序的 cmets,因为它使用 NavigableMap 并因此对键进行排序,否则通过比较器进行排序。不使用 SortedSet 真的没有好办法吗?
SortedMap<Integer[], Integer> sortedFitPop = fitPop.entrySet()
.stream()
//now I want to insert entries into the TreeMap
//with sortedness according to the Comparator above
.collect(Collectors.toCollection((k,v) -> (k,v), new TreeMap(fitnessOrder)
));
键应该仍然是键,值应该仍然是它们在 HashMap 中的值,但是现在在收集时,我希望 TreeMap 应该始终从头开始排序,并且在放置每个条目之后。
& 是的,当然最好不要收集到 HashMap 中开始,我觉得有一种方法可以使用 Java-8/streams/lambdas 来干净地完成它。
提前感谢您!我好想知道这些东西!
【问题讨论】:
-
请重新表述您的排序标准。
-
理想情况下,我想返回一个 SortedMap
,其中 Map 有一个比较器,根据 Integer 值排序,而不是 Integer[] 键。 -
先看HERE。您不能使用
TreeMap按值对Map进行排序,因为它是按键排序的。您应该对您的条目进行排序并将其放在一个LinkedHashMap中,它会记住插入的顺序。
标签: lambda java-8 java-stream