将比较器添加到集合时它是如何工作的?
例如,如果我在树集上使用比较器
TreeSet<Market> tree = new TreeSet<>(new Market().new Comp());
for(int i = 0 ; i < 3 ; i++) {
tree.add(new Market(i, i + 1));
}
public class Comp implements Comparator<Market> {
@Override
public int compare(Market A, Market B) {
return A.w - B.w;
}
}
它是否将市场A视为树和B中已存在的东西作为添加到树中的新市场?或者不是吗?
public class Market {
int w, h;
public Market(int w, int h) {
this.w = w;
this.h = h;
}
public String toString() {
return "w: " + w + ", h: " + h;
}
public class Comp implements Comparator<Market> {
@Override
public int compare(Market A, Market B) {
return A.w - B.w;
}
}
}
答案 0 :(得分:1)
这是一个实现细节。 TreeSet
的实施(或者更确切地说是支持TreeMap
的实施)可以根据需要确定A
或B
是Set
中已有的元素当它调用compare
时。
compare
的实施不应受此实施细节的影响。
看看JDK 8的实现,我看到第一个参数(A)碰巧是你想要添加的键(或元素)(或检查它是否已经存在),第二个参数是一个键(或者元素)已经在TreeMap
(或TreeSet
)中:
final Entry<K,V> getEntryUsingComparator(Object key) {
@SuppressWarnings("unchecked")
K k = (K) key;
-----------
Comparator<? super K> cpr = comparator;
if (cpr != null) {
Entry<K,V> p = root;
while (p != null) {
int cmp = cpr.compare(k, p.key);
-
if (cmp < 0)
p = p.left;
else if (cmp > 0)
p = p.right;
else
return p;
}
}
return null;
}