Объяснение о Компараторе в Коллекции - PullRequest
0 голосов
/ 10 июня 2018

Когда вы добавляете компаратор в коллекцию, как он работает?

Например, если я использовал компаратор на наборе деревьев

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

Рассматривает ли он рынок А как нечто такое, чтоуже существует в дереве и 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 голосов
/ 10 июня 2018

Это деталь реализации.Реализация 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;
}
...