Java: SortedMap, TreeMap, Сопоставимый? Как использовать?

< TextBlock> не имеет никакого декоративного, приписывает себя. Я поместил бы его на < Canvas> с < Rectangle> и примените штрих там.

5
задан Nick Heiner 17 September 2009 в 17:02
поделиться

5 ответов

  1. Более простой способ - реализовать Comparable с вашими существующими объектами, хотя вместо этого вы можете создать Comparator и передать его в SortedMap .
    Обратите внимание, что Comparable и Comparator - это две разные вещи; класс, реализующий Comparable , сравнивает этот с другим объектом, а класс, реализующий Comparator , сравнивает два других объекта.
  2. Если вы реализуете Сравнимо , вам не нужно передавать в конструктор ничего особенного. Просто вызовите new TreeMap () . ( Изменить: За исключением того, что, конечно, Карты нуждаются в двух общих параметрах, а не в одном. Глупый я!)
    Если вместо этого вы создаете другой класс, реализующий Comparator , передайте экземпляр этого класса в конструктор.
  3. Да, согласно TreeMap Javadocs .

Изменить: Если перечитать вопрос, все это не имеет смысла. Если у вас уже есть список, разумно реализовать Comparable , а затем вызвать для него Collections.sort . Никаких карт не требуется.

Небольшой код:

public class MyObject implements Comparable<MyObject> {
    // ... your existing code here ...
    @Override
    public int compareTo(MyObject other) {
        // do smart things here
    }
}

// Elsewhere:
List<MyObject> list = ...;
Collections.sort(list);

Как и в случае с SortedMap , вы можете вместо этого создать Comparator и передать его в Collections. sort (Список, Компаратор) .

8
ответ дан 18 December 2019 в 13:16
поделиться

1.

Это зависит от ситуации. Скажем, объект A должен отсортировать перед объектом B в вашем наборе. Если в целом имеет смысл считать A меньше, чем B, тогда будет иметь смысл реализация Comparable. Если порядок имеет смысл только в контексте, в котором вы используете набор, вам, вероятно, следует создать Компаратор.

2.

new TreeMap(new MyComparator());

Или без создания класса MyComparator:

new TreeMap(new Comparator<MyClass>() {
    int compare(MyClass o1, MyClass o2) { ... }
});

3. Да.

3
ответ дан 18 December 2019 в 13:16
поделиться

В моем ответе предполагается, что вы используете TreeMap реализацию SortedMap .

1.) При использовании TreeMap , у вас есть выбор. Вы можете реализовать Comparable непосредственно в своем классе или передать отдельный Comparator конструктору.

2.) Пример:

Comparator<A> cmp = new MyComparator();
Map<A,B> map = new TreeMap<A,B>(myComparator);

3.) Да, это правильно. Внутренне TreeMap использует красно-черное дерево для хранения элементов в порядке их вставки; временные затраты на выполнение вставки (или извлечения) составляют O (log N).

1
ответ дан 18 December 2019 в 13:16
поделиться

Вы создаете Компаратор . Затем Comparator сравнивает поле, которое вы хотите отсортировать.

Когда вы создаете TreeMap , вы создаете TreeMap и передаете Компаратор в качестве аргумента. Затем, когда вы вставляете объекты типа ClassYouWantToSort , TreeMap использует ваш Comparator для их правильной сортировки.

EDIT: Как отмечает Адамски, вы также можете сделать ClassYouWantToSort сам Comparable . Преимущество состоит в том, что вам нужно иметь дело с меньшим количеством классов, код проще, а ClassYouWantToSort получает удобный порядок по умолчанию. Недостатком является то, что ClassYouWantToSort может не иметь единственного очевидного упорядочивания, поэтому вам все равно придется реализовать Comparables для других ситуаций. Вы также не сможете изменить ClassYouWantToSort .

EDIT2: если у вас есть только набор объектов, которые вы добавляете в коллекцию, и это не Map ( т.е. это не отображение одного набора объектов в другой) тогда вам нужен TreeSet , а не TreeMap .

0
ответ дан 18 December 2019 в 13:16
поделиться

Поскольку у вас есть список и вы получаете сообщение об ошибке, потому что у вас есть один аргумент на карте, я полагаю, вам нужен отсортированный набор:

SortedSet<Ktr> set = new TreeSet<Ktr>(comparator);

Это сохранит набор отсортированным, т.е. итератор вернет элементы в порядке их сортировки. Существуют также методы, специфичные для SortedSet , которые вы, возможно, захотите использовать. Если вы также хотите вернуться назад, вы можете использовать NavigableSet .

2
ответ дан 18 December 2019 в 13:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: