gpt4 book ai didi

java - 具有自己的比较器实现的 TreeMap

转载 作者:行者123 更新时间:2023-12-02 07:51:37 26 4
gpt4 key购买 nike

大家。

我用自己的方法 compare() 实现编写了一个 TreeMap

目的是按顺序对映射的键进行排序:时间较少且位值较少的条目应位于顶部。所有条目都有独特的时间。我想在具有位的对象之间进行选择:false - 选择时间较少的对象。

但是以下 Java 代码限制我添加一些新条目。

private TreeMap<Entry<K>,V>  map = new TreeMap<Entry<K>,V>(new Comparator<Entry<K>>() {

@Override
public int compare(Entry<K> entry1, Entry<K> entry2) {

int time1 = entry1.getTime();
int time2 = entry2.getTime();

boolean bit1 = entry1.isBit();
boolean bit2 = entry2.isBit();

if (time1 < time2) {
if ( (bit1 == false && bit2 == true)
|| (bit1 == false && bit2 == false)
|| (bit1 == true && bit2 == true))
return -1;
} else if (time1 > time2) {
if ( (bit1 == true && bit2 == false)
|| (bit1 == true && bit2 == true)
|| (bit1 == false && bit2 == false))
return 1;
}

return 0;
}

});

谁能解释一下为什么吗?

P.s.我用键添加了条目:1、2、3、4、5。然后我尝试用键 4 添加条目,但没有添加。键 1, 2 .. - 这意味着我创建具有 3 个字段的条目:键、位(假 - 默认)、时间(由计数器创建的唯一值)。因此,我的所有条目都是独一无二的。

这是入门级:

public class Entry<K> {

private K id;
private boolean bit;
private int time;

public Entry(K id, Boolean bit, int time) {

this.setId(id);
this.setBit(bit);
this.setTime(time);

}

public K getId() {
return id;
}

public void setId(K id) {
this.id = id;
}

public boolean isBit() {
return bit;
}

public void setBit(boolean bit) {
this.bit = bit;
}

public int getTime() {
return time;
}

public void setTime(int time) {
this.time = time;
}

public boolean equals(Object o){
if (this.id == ((Entry)o).getId()){
return true;
}
return false;
}
}

通过这种方式我添加新条目:

public void put(K key, V value){
entry = new Entry<K>(key, false, clock++);
if (map.size() < initialCapacity){
map.put(entry, value);
} else {
if (this.get(key) == null) {
map.remove(map.firstEntry().getKey());
map.put(entry, value);
}
}
}

public V get(K key){
Iterator it = map.keySet().iterator();
while (it.hasNext()){
Entry entry = (Entry) it.next();
if (key.equals(entry.getId())){
entry.setBit(true);
return map.get(entry);
}
}
return null;
}

运行代码:

ClockCacheMaximus<BigInteger, Object> ccm = new ClockCacheMaximus<BigInteger, Object>(3);;
ccm.put(new BigInteger("1"), "aaa");
System.out.println("map" + ccm.getAll());
System.out.println();
ccm.put(new BigInteger("2"), "bbb");
System.out.println("map" + ccm.getAll());
System.out.println();
ccm.put(new BigInteger("3"), "ccc");
System.out.println("map" + ccm.getAll());
System.out.println();
ccm.put(new BigInteger("4"), "ddd");
System.out.println("map" + ccm.getAll());
System.out.println();
ccm.put(new BigInteger("5"), "www");
System.out.println("map" + ccm.getAll());
System.out.println();
ccm.put(new BigInteger("4"), "rrr");
System.out.println("map" + ccm.getAll());
System.out.println();
ccm.put(new BigInteger("6"), "rrr");
System.out.println("map" + ccm.getAll());
System.out.println();
ccm.put(new BigInteger("7"), "rrr");
System.out.println("map" + ccm.getAll());
System.out.println();
ccm.put(new BigInteger("8"), "rrr");
System.out.println("map" + ccm.getAll());
System.out.println();
ccm.put(new BigInteger("9"), "rrr");
System.out.println("map" + ccm.getAll());

结果:

条目:键= 1;位=假;时间=0;值=aaa---因为标准尺寸而放置:aaa map [1]

条目:键= 2;位=假;时间=1;值=bb---因为标准尺寸而放置:bbb map [1, 2]

条目:键= 3;位=假;时间=2;值 = ccc---因为标准尺寸而放置:ccc map [1,2,3]

条目:键= 4;位=假;时间=3;值 = dd---放置与删除 map [2,3,4]

条目:键= 5;位=假;时间=4;值 = www---放置与删除 map [3,4,5]

条目:键= 4;位=假;时间=5;值=rrr!发现对象 map [3,4,5]

条目:键= 6;位=假;时间=6;值=rrr---放置与删除 map [4, 5]

条目:键= 7;位=假;时间=7;值=rrr---因为标准尺寸而放置:rrr map [4, 5]

条目:键= 8;位=假;时间=8;值=rrr---因为标准尺寸而放置:rrr map [4, 5]

条目:键= 9;位=假;时间=9;值=rrr---因为标准尺寸而放置:rrr map [4, 5]

最佳答案

TreeMap 仅使用比较器来检查唯一性。
如果您有 2 个根据您的比较器相等的键,那么其中之一将不会添加到 map 中。请参阅SortedMap :

Note that the ordering maintained by a sorted map (whether or not an explicit comparator is provided) must be consistent with equals if the sorted map is to correctly implement the Map interface. (See the Comparable interface or Comparator interface for a precise definition of consistent with equals.) This is so because the Map interface is defined in terms of the equals operation, but a sorted map performs all key comparisons using its compareTo (or compare) method, so two keys that are deemed equal by this method are, from the standpoint of the sorted map, equal. The behavior of a tree map is well-defined even if its ordering is inconsistent with equals; it just fails to obey the general contract of the Map interface.

在您看来,键是唯一的(如果您使用 equals 检查,它们是唯一的),但 TreeMap 仅使用比较器来检查唯一性。

关于java - 具有自己的比较器实现的 TreeMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10161872/

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