关于集合中比较器的说明

时间:2018-06-10 07:28:12

标签: java collections comparator

将比较器添加到集合时它是如何工作的?

例如,如果我在树集上使用比较器

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

1 个答案:

答案 0 :(得分:1)

这是一个实现细节。 TreeSet的实施(或者更确切地说是支持TreeMap的实施)可以根据需要确定ABSet中已有的元素当它调用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;
}