java.util.NoSuchElementException - 迭代已排序的treemap

时间:2014-10-10 17:22:04

标签: java iterator treemap

我循环播放了我的程序,并且由于某些原因我没有遇到以下错误

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返回值

entriesSortedByValue

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;
    }

1 个答案:

答案 0 :(得分:1)

如果您有多个具有相同值的条目,它们将由您编写的比较器合并,因为TreeSet会扣除相对于其比较器的元素。

假设amountOfIntersectTeams是您正在处理的地图的大小,那么我最好的选择是什么。

要解决此问题,我建议您在Comparator中比较相等的值时,对其中的键进行二次比较。