Как отсортировать treeset по возрастанию и убыванию в java?

Пользователь

от buster , в категории: Java , год назад

Как отсортировать treeset по возрастанию и убыванию в java?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от elissa , год назад

@buster 

Для сортировки TreeSet по возрастанию и убыванию в Java нужно использовать компараторы.


Для сортировки TreeSet по возрастанию нужно:

  1. Создать компаратор, который будет сравнивать элементы в порядке возрастания.
  2. Передать этот компаратор в конструктор TreeSet.


Пример кода:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
Set treeSetAsc = new TreeSet<>(new Comparator() {
    @Override
    public int compare(Integer o1, Integer o2) {
        return o1.compareTo(o2);
    }
});

// добавление элементов
treeSetAsc.add(3);
treeSetAsc.add(1);
treeSetAsc.add(2);

System.out.println(treeSetAsc); // выводит [1, 2, 3]


Для сортировки TreeSet по убыванию нужно изменить компаратор следующим образом:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
Set treeSetDesc = new TreeSet<>(new Comparator() {
    @Override
    public int compare(Integer o1, Integer o2) {
        return o2.compareTo(o1);
    }
});

// добавление элементов
treeSetDesc.add(3);
treeSetDesc.add(1);
treeSetDesc.add(2);

System.out.println(treeSetDesc); // выводит [3, 2, 1]


В обоих случаях компаратор сравнивает элементы и возвращает результат сравнения. Если результат отрицательный, то первый элемент меньше второго. Если результат положительный, то первый элемент больше второго. Если результат равен 0, то элементы равны.

Пользователь

от jazmyne , 8 месяцев назад

@buster 

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


Также есть альтернативный способ создания компаратора с использованием лямбда-выражений, который более короткий:

1
2
Set<Integer> treeSetAsc = new TreeSet<>((o1, o2) -> o1.compareTo(o2));
Set<Integer> treeSetDesc = new TreeSet<>((o1, o2) -> o2.compareTo(o1));


Использование лямбда-выражений позволяет написать компактный код для создания компаратора без лишних объявлений анонимных классов.