Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 按值排序的树映射不起作用?_Java_Sorting - Fatal编程技术网

Java 按值排序的树映射不起作用?

Java 按值排序的树映射不起作用?,java,sorting,Java,Sorting,我不明白为什么我的自定义UpdateableTreeMap类不起作用。它应该根据其值对树映射进行排序 完整代码如下: import org.bukkit.entity.Player; import java.util.*; public class UpdateableTreeMap { private final HashMap<Player, PlayerData> hashMap; private final TreeMap<Player, Play

我不明白为什么我的自定义
UpdateableTreeMap
类不起作用。它应该根据其值对
树映射进行排序

完整代码如下:

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

    }

}
import org.bukkit.entity.Player;
导入java.util.*;
公共类UpdateableTreeMap{
私有最终HashMap HashMap;
私有最终树状图树状图;
公共UpdateableTreeMap(){
hashMap=新的hashMap();
treeMap=newtreemap(newvaluecomparator(hashMap));
}
公共地图internalMap(){
返回hashMap;
}
公共集密钥集(){
返回hashMap.keySet();
}
公共布尔containsKey(对象键){
返回hashMap.containsKey(键);
}
公共播放器数据获取(对象键){
返回hashMap.get(key);
}
公共播放器数据删除(对象键){
树映射。移除(键);
返回hashMap.remove(键);
}
公共布尔值为空(){
返回hashMap.isEmpty();
}
公共整数大小(){
返回hashMap.size();
}
public Map.Entry firstEntry()的{
返回treeMap.firstEntry();
}
公共集入口集(){
返回hashMap.entrySet();
}
公共集sortedEntrySet(){
返回treeMap.entrySet();
}
公共集合值(){
返回hashMap.values();
}
公共集合分类价值(){
返回treeMap.values();
}
公共玩家数据put(玩家密钥、玩家数据值){
hashMap.put(键、值);
返回treeMap.put(键、值);
}
公共无效更新(玩家密钥){
PlayerData值=treeMap.remove(键);
if(值!=null){
树映射put(键、值);
}
}
公共静态类ValueComparator实现了Comparator{
私人最终地图;
公共价值比较(Map){
this.map=map;
}
公共整数比较(玩家o1,玩家o2){
如果(o1==o2)
返回0;
PlayerData d1=map.get(o1);
PlayerData d2=映射获取(o2);
System.out.println(o1.getName()+“”+d1.maxhealth+“-”+d2.maxhealth+“”+o2.getName());
System.out.println(“结果:+(o1==o2?0:(d1.maxhealth

当我调用
update(Player)
时,由于
System.out.println()
compare(Player,Player)
返回-1,我可以清楚地看到。但是,当我使用
sortedValues()
方法在树映射中循环时,顺序是不正确的。

根据树映射API,树映射.values()按键的顺序返回值,而不是值

公共集合值()

返回此映射中包含的值的集合视图

集合的迭代器按相应键的升序返回值。集合的拆分器是后期绑定的、故障快速的,并且另外报告拆分器。按遭遇顺序排序,该遭遇顺序为相应键的升序

集合由映射支持,因此对映射的更改将反映在集合中,反之亦然。如果在集合上进行迭代时修改映射(除了通过迭代器自己的删除操作),则迭代的结果是未定义的。集合支持元素移除,即通过Iterator.remove、collection.remove、removeAll、retainal和clear操作从映射中移除相应的映射。它不支持添加或添加所有操作

指定人: 接口映射中的值 指定人: 接口SortedMap中的值 覆盖: 类AbstractMap中的值 返回: 此映射中包含的值的集合视图


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

每个TreeMap API,TreeMap.values()按键的顺序返回值,而不是值

公共集合值()

返回此映射中包含的值的集合视图

集合的迭代器按相应键的升序返回值。集合的拆分器是后期绑定的、故障快速的,并且另外报告拆分器。按遭遇顺序排序,该遭遇顺序为相应键的升序

集合由映射支持,因此对映射的更改将反映在集合中,反之亦然。如果在集合上进行迭代时修改映射(除了通过迭代器自己的删除操作),则迭代的结果是未定义的。集合支持元素移除,即通过Iterator.remove、collection.remove、removeAll、retainal和clear操作从映射中移除相应的映射。它不支持添加或添加所有操作

指定人: 接口映射中的值 指定人: 接口SortedMap中的值 覆盖: 类AbstractMap中的值 返回: 此映射中包含的值的集合视图


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

每个TreeMap API,TreeMap.values()按键的顺序返回值,而不是值

公共集合值()

返回此映射中包含的值的集合视图

集合的迭代器按相应键的升序返回值。集合的拆分器是后期绑定的、故障快速的,并且另外报告拆分器。按遭遇顺序排序,该遭遇顺序为相应键的升序

集合由映射支持,因此对映射的更改将反映在集合中,反之亦然。如果在集合上进行迭代时修改映射(除