我循环播放了我的程序,并且由于某些原因我没有遇到以下错误
Exception in thread "main" java.util.NoSuchElementException
at java.util.TreeMap$PrivateEntryIterator.nextEntry(Unknown Source)
at java.util.TreeMap$KeyIterator.next(Unknown Source)
at EloRating.setNewSeason(EloRating.java:242)
此错误指向迭代器循环。
TreeMap<String,Double> treeMap = new TreeMap<String,Double>();
for (Entry<String, Double> team : teamsIntersection.entrySet()) {
treeMap.put(team.getKey(), listTeams.get(team.getKey()).getRating());
}
SortedSet<Entry<String, Double>> listSorted = entriesSortedByValues(treeMap);
Iterator<Entry<String, Double>> iter = listSorted.iterator();
int stop = (amountOfIntersectTeams+1)/2;
for(int i = 0; i < (stop-1); i++){
-----------> iter.next();
}
double median = iter.next().getValue();
如果我执行一次程序,没有什么特别的事情发生。但是出于一些基准原因,我通过一些略微调整的参数来循环程序25.000次。 当我尝试使用错误后的参数再次启动程序时,它会更进一步。 [在此错误发生时,迭代器包含10个值]
我希望Hashmap teamsIntersection的值具有上限中位数。 例如a-3 b-1 c-2 d-2 e-5 f-4然后我希望从3返回值
static <K,V extends Comparable<? super V>>
SortedSet<Map.Entry<K,V>> entriesSortedByValues(Map<K,V> map) {
SortedSet<Map.Entry<K,V>> sortedEntries = new TreeSet<Map.Entry<K,V>>(
new Comparator<Map.Entry<K,V>>() {
@Override public int compare(Map.Entry<K,V> e1, Map.Entry<K,V> e2) {
return e1.getValue().compareTo(e2.getValue());
}
}
);
sortedEntries.addAll(map.entrySet());
return sortedEntries;
}
答案 0 :(得分:1)
如果您有多个具有相同值的条目,它们将由您编写的比较器合并,因为TreeSet
会扣除相对于其比较器的元素。
假设amountOfIntersectTeams
是您正在处理的地图的大小,那么我最好的选择是什么。
要解决此问题,我建议您在Comparator
中比较相等的值时,对其中的键进行二次比较。