Как отсортировать двумерный массив с помощью Comparator в java - PullRequest
2 голосов
/ 07 апреля 2020

Мне нужно отсортировать такой массив по убыванию элементов первого столбца. В случае равенства элементов в первом столбце элементы второго столбца должны быть отсортированы в порядке возрастания. Но это то, что мне нужно еще, чтобы проверить и положить пустую строку в конец матрицы, и строки с одним элементом, помещенным до того же самого, который имеет больше элементов. Например, в этом массиве {3} - это первая строка, {} - последняя.

int[][] arr = {{1, 2, 3}, {}, {3}, {1, 4}, {3, 2}, {3, 3, 5}};

 Arrays.sort(arr, new Comparator<int[]>() {
     @Override
     public int compare(int[] o1, int[] o2) {
        if(o1[0] == o2[0])
            return o1[1] - o2[1];
        return o2[0] - o1[0];
    }
});

for (int[] ints : arr) {
    for (int anInt : ints) {
        System.out.print(anInt + " ");
    }
    System.out.println();
}

1 Ответ

3 голосов
/ 07 апреля 2020

Следующие Comparator<int[]> включают сортировку по:

  1. Пустые массивы как последние

  2. Большее число с тем же индексом в порядке возрастания

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

Вот алгоритм, который можно легко изменить в соответствии с вашими потребностями:

int[][] arr = {{1, 2, 3}, {}, {3}, {1, 4}, {3, 2, 2}, {3, 3, 5}, {3, 2}};

Arrays.sort(arr, (o1, o2) -> {
        if (o1.length == 0) { return 1; }         // empty last
        if (o2.length == 0) { return -1; }        // empty last
        int min = Math.min(o1.length, o2.length); // upper bound to avoid ArrayIndexOutOfBoundsException
        for (int i = 0; i < min ; i++) {
            if (o1[i] != o2[i]) {                 // compare values on indices
                return o1[i] - o2[i];             // return if different
            } 
        }
        return 1;                                 // it goes first so it lefts first
    }
);

System.out.println(Arrays.deepToString(arr)); 

Вывод будет:

[[1, 2, 3] , [1, 4], [3], [3, 2, 2], [3, 2], [3, 3, 5], []]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...