Вопрос

У меня есть список объектов, которые мне нужно отсортировать по свойствам одного из их полей.Я слышал, что SortedMap и Comparators — лучший способ сделать это.

  1. Реализовать Comparable с классом, который я сортирую, или создать новый класс?
  2. Как мне создать экземпляр SortedMap и передать его в Компаратор?
  3. Как происходит сортировка?Будет ли он автоматически сортировать все при вставке новых объектов?

РЕДАКТИРОВАТЬ:Этот код выдает мне ошибку:

private TreeMap<Ktr> collection = new TreeMap<Ktr>();

(Ктр реализует Comparator<Ktr>).Eclipse говорит, что ожидает чего-то вроде TreeMap<K, V>, поэтому количество параметров, которые я предоставляю, неверно.

Это было полезно?

Решение

  1. Более простой способ — реализовать Comparable с существующими объектами, хотя вместо этого вы можете создать Comparator и передать его в SortedMap.
    Обратите внимание, что Comparable и Comparator это две разные вещи;класс, реализующий Comparable сравнивает this другому объекту, в то время как класс, реализующий Comparator сравнивает два другой объекты.
  2. Если вы реализуете Comparable, вам не нужно передавать в конструктор ничего особенного.Просто позвони new TreeMap<MyObject>(). (Редактировать: Кроме этого, конечно Maps нужны два общих параметра, а не один.Дурак я!)
    Если вместо этого вы создадите другой класс, реализующий Comparator, передайте экземпляр этого класса в конструктор.
  3. Да, согласно TreeMap Javaдокументация.

Редактировать: При перечитывании вопроса все это не имеет смысла.Если у вас уже есть список, разумнее всего реализовать 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<MyObject> и передать его Collections.sort(List, Comparator).

Другие советы

1.

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

2.

new TreeMap(new MyComparator());

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

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

3.Да.

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

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

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

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

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

2.) Пример:

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

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

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

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

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

РЕДАКТИРОВАТЬ2:Если у вас есть только несколько объектов, которые вы добавляете в коллекцию, и это не Map (т.е.это не сопоставление одного набора объектов с другим), тогда вам нужен TreeSet, а не TreeMap.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top