Сортировка двумерного целочисленного массива на основе столбца - PullRequest
5 голосов
/ 29 октября 2011

У меня есть 2D-массив, который я хочу отсортировать по второму столбцу.Первый столбец должен оставаться в паре со вторым столбцом.

Первоначально 2D-массив выглядит следующим образом (матрица 2x10):

0 10
1 9
2 9
3 9
4 15
5 10
6 4
7 8
8 11
9 12

Я хочу, чтобы вышеуказанный 2D-массив сортировался следующим образомthis:

4 15
9 12
8 11
0 10
5 10
1 9
2 9
3 9
7 8
6 4

Теперь я попытался адаптировать ответ из: Сортировать двумерный массив на основе одного столбца в этот код:

Arrays.sort(theArray, new Comparator<Integer[]>()
{
    @Override
    public int compare(Integer[] int1, Integer[] int2)
    {
        Integer numOfKeys1 = int1[1];
        Integer numOfKeys2 = int2[1];
        return numOfKeys1.compareTo(numOfKeys2);
    }
});

Тем не менее, кажется, что не сортировать массив вообще.При печати массива после вызова функции sort () массив находится в своем первоначальном порядке.

Я также попытался адаптировать ответ отсюда: сортировка 2D-массива String в Java , но я столкнулсята же проблема.

Допустил ли я какую-то фатальную ошибку при адаптации этих решений, или мой код должен работать?

Кроме того, как мне будет сортировать этот массив по убыванию?Могу ли я заменить оператор return в compare () этой строкой?

return -numOfKeys2.compareTo(numOfKeys1);

Любая помощь будет принята с благодарностью.Спасибо!

РЕДАКТИРОВАТЬ: просто опубликовать оставшуюся часть моего кода, чтобы увидеть, если проблема в другом месте.

public void Sort()
{   
    Integer[][] theArray = {{0,10},{1,9},{2,9},{3,9},{4,15},{5,10},{6,4},{7,8},{8,11},{9,12}};;

    dump(theArray);
    Arrays.sort(theArray, new Comparator<Integer[]>()
    {
        @Override
        public int compare(Integer[] int1, Integer[] int2)
        {
            Integer numOfKeys1 = int1[1];
            Integer numOfKeys2 = int2[1];
            return numOfKeys1.compareTo(numOfKeys2);
        }
    });

    System.out.println("====");
    dump(theArray);     
}

public void dump(Integer[][] array)
{
    for(int p = 0, q = 10; p < q; p++)
    {
        System.out.println(array[p][0] + " " + array[p][1]);
    }
}

РЕДАКТИРОВАТЬ 2:

У меня это работает.Спасибо всем за вашу помощь.У меня было несколько функций Sort () (старая, которая не работала, и та, что вы видите выше), и оказалось, что я звонил не той, хотя я думал, что изменил вызов.Только один из тех дней.

Не стесняйтесь использовать приведенный выше код, если вы хотите отсортировать массив.Теперь он полностью работает.

Ответы [ 3 ]

1 голос
/ 29 октября 2011

Код тоже работает для меня. Извините за грязный код, я должен был сделать быстрый тест. Привет!

import java.util.*;

class arraysort {

    public static Integer[][] mysort(Integer[][] ar) {
        Arrays.sort(ar, new Comparator<Integer[]>() {
            @Override
            public int compare(Integer[] int1, Integer[] int2) {
                Integer numOfKeys1 = int1[1];
                Integer numOfKeys2 = int2[1];
                return numOfKeys1.compareTo(numOfKeys2);
            }
        });
        return ar;
    }

    public static void main(String[] s) {
        Integer[][] myarr = {{0, 10}, {1, 9}, {2, 9}, {3, 9}, {4, 15}, {5, 10}, {6, 4}};

        for (Integer[] i : myarr) {
            System.out.println(i[0] + "," + i[1]);
        }

        myarr = mysort(myarr);

        for (Integer[] i : myarr) {
            System.out.println(i[0] + "," + i[1]);
        }
    }
}
1 голос
/ 29 октября 2011

У меня отлично работает.В обратном порядке вы должны отменить исходные compareTo, или , поменять местами переменные, но не обе.

Нам, вероятно, понадобится увидеть остальную часть кода, чтобы понять, почему вывидишь то, что видишь;Я вырезал и вставил ваш код дословно, так что шансы хорошие, проблема в другом месте.


dump(theArray);
Arrays.sort(theArray, new Comparator<Integer[]>() {
    public int compare(Integer[] int1, Integer[] int2) {
        Integer numOfKeys1 = int1[1];
        Integer numOfKeys2 = int2[1];
        return numOfKeys1.compareTo(numOfKeys2);
    }
});
System.out.println("================");
dump(theArray);


0 10 
0 10 
1 9 
2 9 
3 9 
4 15 
5 10 
6 4 
7 8 
8 11 
9 12 
================
6 4 
7 8 
1 9 
2 9 
3 9 
0 10 
0 10 
5 10 
8 11 
9 12 
4 15 
0 голосов
/ 29 октября 2011

Я также полностью запустил ваш код, и он работал ... одна вещь, хотя мне пришлось заменить

System.out.println(array[0][p] + " " + array[1][p]);

с

System.out.println(array[p][0] + " " + array[p][1]);

для запуска кода, потому что в противном случае он дает исключение индекса массива за пределами границ.

Отрицание результата сравнения сравнивать проще, чем менять значения и позволяет легко изменять.

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