gpt4 book ai didi

java - 按值排序的 TreeMap 不起作用?

转载 作者:行者123 更新时间:2023-12-01 22:10:01 25 4
gpt4 key购买 nike

我不明白为什么我的自定义 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)时,由于compare(Player, Player)的System.out.println()行,我可以清楚地看到 返回-1。然而,当我使用 sortedValues() 方法循环遍历 TreeMap 时,顺序不正确。

最佳答案

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

公共(public)集合值()

返回此映射中包含的值的 Collection View 。

集合的迭代器按相应键的升序返回值。该集合的 spliterator 是后期绑定(bind)、快速失败的,并且另外报告 Spliterator。 ORDERED 的遭遇顺序是相应键的升序

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

指定者: 接口(interface)Map中的值指定者: 接口(interface) SortedMap 中的值覆盖: AbstractMap 类中的值返回: 此映射中包含的值的 Collection View

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

关于java - 按值排序的 TreeMap 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31995536/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com