Реализуйте Java Comparator в Array.sort () - PullRequest
0 голосов
/ 26 сентября 2019

Предположим, у меня есть массив двумерных массивов, которые представляют точки, которые я хочу сравнить.Например, я могу сравнить расстояние от начала координат.Что я могу сделать, это создать класс Point:

class Point implements Comparable<Point>{
     // class variables, constructor
     public int compareTo(Point p) {
         return (x*x + y*y).compareTo(p.x*p.x + p.y*p.y);
     }
}

и заполнить массив типа Point всеми точками, а затем использовать Array.sort(pointsArray).Это также можно сделать следующими способами:

1) Arrays.sort(points, Comparator.comparing(p -> p[0]*p[0] + p[1]*p[1]));

или

2) Arrays.sort(points, (p1, p2) -> p1[0]*p1[0] + p1[1]*p1[1] - p2[0]*p2[0] - p2[1]*p2[1]);

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

Теперь, что если мне нужно сначала сравнить координату x и, если сравнение не показывает разницы, координату y, то есть:

class Point implements Comparable<Point>{
     // class variables, constructor
     public int compareTo(Point p) {
         int cmp = x.compareTo(p.x);
         if(cmp == 0) return y.compareTo(p.y);
         return cmp;
     }
}

Как это можно перевести в 1) и 2) ?

Ответы [ 2 ]

1 голос
/ 26 сентября 2019

Используйте самый короткий путь, например, Comparator.comparing(Point::getX).thenComparing(Point::getY).

Нет причин использовать более длинные версии.Они менее читабельны, и слишком легко совершать ошибки.Например, вот одна из возможных реализаций

(p1, p2) -> {
    if(p1.x == p2.x) {
        return p1.y.compareTo(p2.y);
    }
    return p1.x.compareTo(p2.x);
}

Требуется намного больше времени, чтобы понять, что там происходит, не так ли?

0 голосов
/ 26 сентября 2019

Просто используйте скобки, чтобы увеличить пространство имен для лямбда-функции для сравнения

Arrays.sort(points, (p1, p2) -> {
    int x1 = p1[0];
    int x2 = p2[0];
    int y1 = p1[1];
    int y2 = p2[1];
     // just for readability no need to make local variables
    if(x1 == x2){
      // compare y1 and y2 values here return 1 for greater 0 for equal -1 for less then
    }else{
    // x compare

    }



});

...