是否可以使用Java中的Arrays.sort(,)排序最后一行的2d-array。以下代码段非常适合按最后一列进行排序,但似乎没有办法根据最后一行进行排序。
我的第一个想法是使用将列转换为行,进行排序,然后将行转换为列。对于非常大的数组有更好的方法吗?
int[][] twoDim = { {1, 2, 3}, {3, 7, 11}, {8, 9, 16}, {4, 2,8}, {5, 3, 9} };
Arrays.sort(twoDim, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return ((Integer) o1[2]).compareTo(o2[2]);
}
});
让我们详细说明整个情况: 这是我在我的数组初始化时的位置,按行和列,您可以将此数据集想象如下:
{1, 2, 3}, //first row with three columns
{3, 7, 11}, //second row with three columns
{8, 9, 16},
{4, 2, 8},
{5, 3, 9} //last row with three columns
按最后一行排序意味着重新排列第一列和第二列的位置,因为5大于3.所以在重新排列数据集后,它看起来像:
2, 1, 3
7, 3, 11
9, 8, 16
2, 4, 8
3, 5, 9 //now it's ordered by last row (first and second column have changed they position, by chance third column is in a right place already)
答案 0 :(得分:1)
如果我正确理解列和行的含义,则无法解答。
如果你看一下这样的数据集:
1, 2, 3
3, 7, 11
8, 9, 16
4, 2, 8
5, 3, 9
现在,如果你按最后一行排序,你会得到以下结果:
{2, 7, 9, 2, 3}, {1,3,8,4,5}, {3, 11, 16, 8, 9}
如果将4, 2, 8
行替换为5,3,9
行,则显然不会出现这种情况。
因此,您必须提出标准订购,或者找到一种不同的方法来解决您面临的实际问题。
如果您正在处理矩阵,我强烈推荐library。
答案 1 :(得分:0)
有趣的问题。
我会通过实施quick sort的变体来实现。变体基本上在partition
函数中:
这是一个实现:
public void qsortOnLastRow(int[][] matrix, int left, int right) {
if (left < right) {
int i = partition(matrix, left, right);
qsortOnLastRow(matrix, left, i - 1);
qsortOnLastRow(matrix, i + 1, right);
}
}
public int partition(int[][] matrix, int left, int right) {
int lastrow = matrix.length - 1;
int pivotValue = matrix[lastrow][left];
int i = left;
for (int j = left + 1; j <= right; j++) {
if (matrix[lastrow][j] <= pivotValue) {
i++;
swapColumns(matrix, i, j);
}
}
swapColumns(matrix, left, i);
return i;
}
public void swapColumns(int[][] matrix, int c0, int c1) {
if (c0 != c1) {
for (int i = 0; i < matrix.length; i++) {
int t = matrix[i][c0];
matrix[i][c0] = matrix[i][c1];
matrix[i][c1] = t;
}
}
}
您可以通过致电int[][] matrix
;
qsortOnLastRow(matrix, 0, matrix[0].length - 1)
进行排序
复杂性,如果我没错,应该是O(m * n * log n)
,其中m =行数,n =矩阵中的列数。
注意:您可以使用相同的技巧(排序最后一行和交换列)以及其他排序算法。
答案 2 :(得分:0)
请记住,二维数组是数组的数组。每种排序算法都需要一个工具来移动您要排序的条目。您按最后一列排序的解决方案有效,因为Arrays.sort
将您的内部数组视为要排序的对象。您所谓的最后一行排序,没有等效对象,它应该代表列。
所以你有两个选择:
实现自己的排序算法,一次交换整列,但请使用教科书算法。
转置矩阵。但请记住,如果可以在整个程序中交换第一个和第二个索引的含义,这可能是免费的。