首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按多列中的值对2d数组进行排序

按多列中的值对2d数组进行排序
EN

Stack Overflow用户
提问于 2020-03-15 02:09:09
回答 2查看 143关注 0票数 0

我想要在Java中构建一个方法,根据多个给定列中的值对数组进行排序。让我用一个例子(矩阵数组)解释一下:

代码语言:javascript
复制
int matrix[][] = {
        {0,2,432},{1,1,282},{2,2,456},{3,4,191},{4,5,293},
        {5,2,475},{6,2,491},{7,5,171},{8,5,134},{9,3,354}};

我需要按照第二个位置按递减顺序对每一个三重奏进行排序。在那之后,我需要按照第三个位置按增加的顺序排列三重奏。

我所使用的代码是:

代码语言:javascript
复制
import java.util.*;

public class sort2DMatrixByColumn {
    // Function to sort by column
    public static void sortByColumn(int arr[][], int col) {
        // Using built-in sort function Arrays.sort
        Arrays.sort(arr, new Comparator<int[]>() {
            @Override
            // Compare values according to columns
            public int compare(final int[] entry1,
                               final int[] entry2) {

                if (entry1[col] < entry2[col])
                    return 1;
                else
                    return -1;
            }
        }); // End of function call sort().
    }

    // Driver Code
    public static void main(String args[]) {
        int matrix[][] = {
                {0,2,432},{1,1,282},{2,2,456},{3,4,191},{4,5,293},
                {5,2,475},{6,2,491},{7,5,171},{8,5,134},{9,3,354}};

        // Sort this matrix by 2rd Column
        int col = 2;
        sortByColumn(matrix, col - 1);

        // Display the sorted Matrix
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[i].length; j++)
                System.out.print(matrix[i][j] + " ");
            System.out.println();
        }
    }
}

前面描述的代码的输出是:

代码语言:javascript
复制
[[8,5,134],[7,5,171],[4,5,293],[3,4,191],[9,3,354],
 [6,2,491],[5,2,475],[2,2,456],[0,2,432],[1,1,282]]

但所需的产出必须是:

代码语言:javascript
复制
[[8,5,134],[7,5,171],[4,5,293],[3,4,191],[9,3,354],
 [0,2,432],[2,2,456],[5,2,475],[6,2,491],[1,1,282]]

请注意,根据第二个位置,我们有以下位置:5,5,5,4,3,2,2,2,2,2,1(递减顺序),根据第三个位置,顺序是: 134,171,293 (第二位置为"5“的三胞胎),191 (第二位置为"4”的三胞胎),354 (第二位置为"3“的三胞胎),432,456,475,491 (第二位置为"2”的三胞胎),最后282为第二位置为"1“的三胞胎。

任何帮助都将不胜感激。谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-15 02:38:06

从sortByColumn方法中删除col参数,因为它实际上不是一个参数,并以这种方式更改该方法:

代码语言:javascript
复制
// Function to sort by column 
public static void sortbyColumn(int arr[][]) {
    // Using built-in sort function Arrays.sort 
    Arrays.sort(arr, new Comparator<int[]>() {
        @Override
        // Compare values according to columns 
        public int compare(final int[] entry1, final int[] entry2) {
            if (entry1[1] < entry2[1])
                return 1;
            else if (entry1[1] > entry2[1])
                return -1;

            return -1 * Integer.valueOf(entry2[2])
                    .compareTo(Integer.valueOf(entry1[2]));
        }
    }); // End of function call sort(). 
}

当然,将main调用更改为sortbyColumn(matrix);

解释:

只有在第二列相等的情况下,我们才需要由第三列进行比较(这意味着第一次比较数值的结果等于0)。在这种情况下,我们用倒序进行比较,用-1将比较结果相乘即可得到。

结果:

代码语言:javascript
复制
8 5 134 
7 5 171 
4 5 293 
3 4 191 
9 3 354 
0 2 432 
2 2 456 
5 2 475 
6 2 491 
1 1 282 
票数 0
EN

Stack Overflow用户

发布于 2020-03-15 02:34:43

试着这样做:

代码语言:javascript
复制
int matrix[][] = {
        {0, 2, 432}, {1, 1, 282}, {2, 2, 456}, {3, 4, 191}, {4, 5, 293},
        {5, 2, 475}, {6, 2, 491}, {7, 5, 171}, {8, 5, 134}, {9, 3, 354}};

Comparator<int[]> secondDecrease = (a, b) -> b[1] - a[1];
Comparator<int[]> thirdIncrease = (a, b) -> a[2] - b[2];

Arrays.stream(matrix)
        .sorted(secondDecrease.thenComparing(thirdIncrease))
        .forEach(s -> System.out.println(Arrays.toString(s)));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60689084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档