Сортировать список пар целых чисел Java - PullRequest
1 голос
/ 26 марта 2012

Я хочу отсортировать массив пар целых чисел.До сих пор я был в состоянии отсортировать их по первому элементу, но я получил что-то вроде (1,2), (1, -2).Я также хочу отсортировать их по второму элементу, чтобы получить правильный отсортированный массив, но я не могу заставить его работать.

Код сортировки первого элемента:

private class FirstElmComparator implements Comparator<Pair> {

    public int compare(Pair pr1, Pair pr2) {
        return pr1.compareFirstElms(pr2);
    }
}

и функция compareFirstElms следующие:

protected int compareFirstElms (Pair p) {
    return (new Integer (this.p1)).compareTo(new Integer (p.p1));
}

Я могу представить второй элемент сравнения следующим:

private class SecondElmComparator implements Comparator<Pair> {

    public int compare(Pair pr1, Pair pr2) {
        return pr1.compareSecondElms(pr2);
    }
}

protected int compareSecondElms (Pair p) {
    return (new Integer (this.p2)).compareTo(new Integer (p.p2));
}

ПРИМЕЧАНИЕ.второй элемент в паре.

Но я думаю, что он переопределит порядок сортировки первого элемента, или я ошибаюсь?Кто-нибудь может мне помочь с этим.

Ответы [ 4 ]

4 голосов
/ 26 марта 2012

Вы создаете один общий компаратор, который оценивает оба элемента пары.

public int compare(Pair pr1, Pair pr2) {
    int firstResult = pr1.compareFirstElms(pr2);
    if (firstResult == 0) { //First comparison returned that both elements are equal
        return pr1.compareSecondElms(pr2);
    } else {
        return firstResult;
    }
}
3 голосов
/ 26 марта 2012

Это очень просто, реализовать это следующим образом:

  • Если первые элементы сравниваемых пар отличаются, то сортировать по первому элементу.
  • В противном случае (еслипервые элементы равны), сортировка по второму элементу.
2 голосов
/ 26 марта 2012

Вы бы не использовали два разных компаратора, кроме одного (который, в свою очередь, мог бы вызывать других для выполнения внутренней работы).

Так что в псевдокоде сравнение будет выглядеть так:

public int compare(Pair pr1, Pair pr2) {

  int result = compare(p1.first, p2.first);

  if( result == 0 ) {
    result = compare(p1.second, p2.second);
  }

  return result;
}
1 голос
/ 26 марта 2012

Ну, во-первых, вам нужно написать явный метод для этого:

public int compare(Pair p) {
    int first = compareFirstElms(p);
    return first == 0 ? compareSecondElms(p) : first;
}

Во-вторых, не переусердствуйте. Сравнивать два целых числа так же просто, как написать this.p1 - p.p1. Нет необходимости в конверсиях.

В-третьих, я бы выбрал явные, краткие, но полные имена. Не произвольно сокращайте части слов, это не совсем помогает читабельности. Как насчет compareByFirst и compareBySecond соответственно?

...