JavaRush /Java блог /Java Developer /Использование Java Arrays.sort() для любого списка объект...

Использование Java Arrays.sort() для любого списка объектов

Статья из группы Java Developer
Сортировка может оказаться непростой задачей, особенно если ваш список List содержит не примитивные числовые типы данных, а их объектные «обёртки» (Byte, Integer, Short, Long, Double, Float). Предлагаю воспользоваться методом, который может быть весьма полезным для решения простых задач или ответа на вопрос интервьюера. Использование Java Arrays.sort() для любого списка объектов  - 1Для начала выберем, чем будем заполнять наш List. В этом примере я буду использовать список рёбер графа (Edges) из простой структуры данных Graph:

// Очень простой класс Edge (рёбро графа) 
public class Edge {
    public Vertex src;
    public Vertex dst;
    public double cost;
    
    // создание ребра между двух вершин 
    Edge(Vertex s, Vertex d, double c) {
        src = s;
        dst = d;
        cost = c;
    }
}
// Список рёбер
Edge[] edges = graph.getEdges();

Что такое граф?

В дискретной математике граф определяют как пару множеств (V,E), где V — подмножество произвольного счётного множества, а E — подмножество (VхV).

Вероятно, тем, кто не привык к математическим абстракциям, такое определение будет не очень понятно, поэтому скажем проще:

граф — это совокупность вершин и рёбер, их соединяющих. Хороший пример графа, который сразу перенесёт его из области абстракции в сферу материального — карта железнодорожных путей.

Вершины такого графа — станции. Ну а пути между ними — рёбра.

Затем определим реализацию интерфейса java.util.Comparator:

class SortByCost implements Comparator&ltEdge> {
    public int compare(Edge a, Edge b) {
        if ( a.cost < b.cost ) return -1;
        else if ( a.cost == b.cost ) return 0;
        else return 1;
    }
}
В этом примере мы будем сортировать ребра графа по их весу или по расстоянию от вершины src (source) до вершины dst (destination). Наконец, используем стандартный метод java.util.Arrays.sort ():

Arrays.sort(edges, new SortByCost())
Теперь наш лист, заполненный объектами Edges отсортирован в порядке возрастания (от наименьшего к наибольшему). Автор решения — Этан Эрровуд (Ethan Arrowood).
Комментарии (3)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Мирослав Уровень 29 Expert
15 апреля 2022
Может очень рано мне сюда, совсем ничего не понял!

// Список рёбер
Edge[] edges = graph.getEdges();

как этим пользоваться:
class SortByCost implements Comparator<Edge> {
    public int compare(Edge a, Edge b) {
        if ( a.cost < b.cost ) return -1;
        else if ( a.cost == b.cost ) return 0;
        else return 1;
    }
}
и как это заменит Arrays.sort(edges, new SortByCost()) в какой момент ?
Стас Пасинков Уровень 26 Master
6 января 2018
"список List содержит не примитивные числовые типы данных, а их объектные «обёртки» (Byte, Integer, Short, Long, Double, Float)" не вижу, как представленная статья описывает как сортировать обертки. статья вообще про компараторы вроде.
Anonymous #1190225 Уровень 40
5 января 2018
В чем суть-то? То что нужно знать о методе Arrays.sort или нужно уметь писать компараторы? К слову, часто будет лучше не создавать компаратор, а воспользоваться стандартным. Arrays.sort(edges, Comparator.comparingInt(Vertex::getCost))