TreeMap按值排序不起作用?

时间:2015-08-13 18:12:06

标签: java sorting

我无法弄清楚为什么我的自定义UpdateableTreeMap课程无效。它应该按其值TreeMap排序。

完整代码:

import org.bukkit.entity.Player;

import java.util.*;

public class UpdateableTreeMap {

    private final HashMap<Player, PlayerData> hashMap;
    private final TreeMap<Player, PlayerData> treeMap;

    public UpdateableTreeMap() {
        hashMap = new HashMap<>();
        treeMap = new TreeMap<>(new ValueComparator(hashMap));
    }

    public Map<Player, PlayerData> internalMap() {
        return hashMap;
    }

    public Set<Player> keySet() {
        return hashMap.keySet();
    }

    public boolean containsKey(Object key) {
        return hashMap.containsKey(key);
    }

    public PlayerData get(Object key) {
        return hashMap.get(key);
    }

    public PlayerData remove(Object key) {
        treeMap.remove(key);
        return hashMap.remove(key);
    }

    public boolean isEmpty() {
        return hashMap.isEmpty();
    }

    public int size() {
        return hashMap.size();
    }

    public Map.Entry<Player, PlayerData> firstEntry() {
        return treeMap.firstEntry();
    }

    public Set<Map.Entry<Player, PlayerData>> entrySet() {
        return hashMap.entrySet();
    }

    public Set<Map.Entry<Player, PlayerData>> sortedEntrySet() {
        return treeMap.entrySet();
    }

    public Collection<PlayerData> values() {
        return hashMap.values();
    }

    public Collection<PlayerData> sortedValues() {
        return treeMap.values();
    }

    public PlayerData put(Player key, PlayerData value) {
        hashMap.put(key, value);
        return treeMap.put(key, value);
    }

    public void update(Player key) {
        PlayerData value = treeMap.remove(key);

        if (value != null) {
            treeMap.put(key, value);
        }
    }

    public static class ValueComparator implements Comparator<Player> {

        private final Map<Player, PlayerData> map;

        public ValueComparator(Map<Player, PlayerData> map) {
            this.map = map;
        }

        public int compare(Player o1, Player o2) {
            if (o1 == o2)
                return 0;

            PlayerData d1 = map.get(o1);
            PlayerData d2 = map.get(o2);

            System.out.println(o1.getName() + " " + d1.maxhealth + " - " + d2.maxhealth + " " + o2.getName());
            System.out.println("Result: " + (o1 == o2 ? 0 : (d1.maxhealth < d2.maxhealth ? 1 : -1)));

            if (d1.maxhealth < d2.maxhealth)
                return 1;
            return -1;
        }

    }

}

当我致电update(Player)时,我可以清楚地看到感谢System.out.println()返回-1的compare(Player, Player)行。然而,当我使用sortedValues()方法遍历TreeMap时,顺序不正确。

2 个答案:

答案 0 :(得分:2)

根据Treemap API,TreeMap.values()返回值按键顺序,而不是值。

public Collection values()

返回此地图中包含的值的Collection视图。

集合的迭代器以相应键的升序返回值。该集合的分裂器是后期绑定,快速失败,并另外报告Spliterator。订购了相应按键的升序的遭遇订单。

集合由地图支持,因此对地图的更改会反映在集合中,反之亦然。如果在对集合进行迭代时修改了映射(除了通过迭代器自己的remove操作),迭代的结果是未定义的。该集合支持元素删除,它通过Iterator.remove,Collection.remove,removeAll,retainAll和clear操作从地图中删除相应的映射。它不支持add或addAll操作。

指定人:     接口Map中的值 具体说明:     接口SortedMap中的值 覆盖:     AbstractMap类中的值 返回:     此地图中包含的值的集合视图

提示:您可以额外付费对TreeMap.values()进行排序。

答案 1 :(得分:1)

我放弃了,最后切换到Google的TreeMultiMap