Как работает compare

298
10 июня 2017, 13:39

Добрый день, ну никак не могу вникнуть, по какому принципу работает compare, уже где только не читал.

Есть код

public class Solution {
public static void main(String[] args) {
    Integer[] array = {13, 8, 15, 5, 17};
    System.out.println(Arrays.toString(sort(array)));
}
public static Integer[] sort(Integer[] array) {
    Arrays.sort(array);
    final double median;
    if (array.length % 2 != 0) {
        median = array[array.length / 2];
    } else {
        median = (array[(array.length / 2 - 1)] + array[(array.length / 2)]) / 2d;
    }
    Arrays.sort(array, new Comparator<Integer>() {
        @Override
        public int compare(Integer o1, Integer o2) {
            System.out.println("o1   " + o1.toString());
            System.out.println("o2   " + o2.toString());
            if (o1.equals(o2)) return 0;
            if (Math.abs(Double.parseDouble(o1.toString()) - median) - Math.abs(Double.parseDouble(o2.toString()) - median) > 0) {
                return 1;
            }
            else if (Math.abs(Double.parseDouble(o1.toString()) - median) - Math.abs(Double.parseDouble(o2.toString()) - median) < 0) {
                return -1;
            }
            else return 0;
        }
    });
    return array;
}
}

Во как он сравнивает значения массива? Не могу понять. Даже специально вывел элементы:

o1   8
o2   5
o1   13
o2   8
o1   15
o2   13
o1   15
o2   8
o1   15
o2   13
o1   17
o2   8
o1   17
o2   15

Вот почему он 5 только один раз с 8 сравнивает и почему 8 первая, т.е. o1 а 5 вторая o2, если в массиве после сортировки 5 первая будет.

Помогите вразумить пожалуйста.

И каким-то чудом он в итоге вывел [13, 15, 17, 8, 5]

Answer 1

Кажется я понял как работает. Он берет 2 объекта.

Общий массив [5, 8, 13, 15, 17] o1 = [8, 13, 15, 17] o2 = [5, 8, 13, 15] И начинает сравнивать o1 = 8, o2 = 5. конечно пока загадка, почему не o1 = [5, 8, 13, 15], а o2 = [8, 13, 15, 17]

READ ALSO
Как организовать передачу данных между android клиентом и сервером на java?

Как организовать передачу данных между android клиентом и сервером на java?

Делаю приложение на android, которое взаимодействует с сервером через сокетыСервер может принимать различные типы данных и в ответ может присылать...

233
android tv как получить событие

android tv как получить событие

Как получить события нажатия на пульт телевизора (не D-pad) в android tv?

185
Точки в Конструктор java

Точки в Конструктор java

Есть конструктор

400
Реализация чата на rxjava+retrofit

Реализация чата на rxjava+retrofit

Сервер при запросе возвращает json схему чата(дата, время, id пользователя, его сообщение и тд), c помощью retrofit я создал метод запроса чата

218