Сортировка двумерного массива не сортируется в правильном порядке

#java #arrays

#java #массивы

Вопрос:

Я пытаюсь отсортировать двумерный массив на основе второго столбца, вот массив:

 [1.1, 60.0]
[1.2, 66.66]
[1.3, -1.0]
[1.4, 50.0]
[1.5, 100.0]
[2.1, -1.0]
[2.2, -1.0]
[2.3, -1.0]
  

Я изучил сортировку многомерных массивов и создал следующий код:

     private void sortKnowledgeScores(double[][] knowledgescores){
    Arrays.sort(knowledgescores, new Comparator<double[]>() {
        @Override
        public int compare(double[] o1, double[] o2) {
            double itemOne = o1[1];
            double itemTwo = o2[1];
            // sort on item id
            if(itemOne < itemTwo){
                return (int) itemOne;
            }
            return (int) itemIdTwo;
        }
  

Это приводит к преобразованию массива в это:

 [2.3, -1.0]
[2.2, -1.0]
[2.1, -1.0]
[1.3, -1.0]
[1.1, 60.0]
[1.2, 66.66]
[1.4, 50.0]
[1.5, 100.0]
  

Что верно для первых трех значений, однако оно ставит 50 ниже 60 и 60,66. Как я могу настроить свою функцию sortKnowledgeScores для сортировки моего массива на основе первого столбца в порядке возрастания?

Ответ №1:

Компаратор должен возвращать 1,0, -1 (как больше, равно, меньше).

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

Вы возвращаете значения, а не результат сравнения.

Вы можете посмотреть этот документ

Вам нужно изменить свой код на:

 public int compare(double[] o1, double[] o2) {
        return (int) o1[1] - o2[1];
 }
  

Как указывает @Mick — обратите внимание, что вы используете индекс: индекс 0 для первого столбца, а индекс 1 для второго

Комментарии:

1. o1 [0] — o2 [0], я думаю

2. это зависит от OP — я знаю, что он сказал «первый» col, что означает индекс 0, но в коде и объяснении он говорит о втором col, поэтому я сохраняю 1 индекс здесь. Это хороший комментарий, если он действительно это имеет в виду, но я не думаю, что это была его проблема

3. Это моя ошибка, я имел в виду второй столбец, который будет иметь индекс 1

Ответ №2:

Прежде всего, вы используете неправильный индекс. Первый элемент в массиве имеет индекс 0

Вы можете использовать Comparator-Factory Comparator.comparingDouble :

 Comparator.comparingDouble(array -> array[0])
  
 Arrays.sort(knowledgescores, Comparator.comparingDouble(array -> array[0]))
  

Ответ №3:

Вы сравниваете элементы с индексом «1». Это переводится во второй столбец. Вы должны использовать индекс «0», если сортировка должна учитывать первый столбец.

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

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