如何根据一维数组值对 Java 中的二维数组进行排序

How to sort 2D array in Java based on 1D array values

如何在 Java 中使用冒泡排序基于一维(双精度)数组对一维(字符串)数组和二维(整数)数组进行排序。 我设法基于 double 数组对 String 数组进行排序,但不知道如何对 2D (int) 数组进行排序。 二维数组(成绩)中的每一行代表每个学生的多个成绩。 我需要通过使用这种结构(三个数组)来实现目标。 一切都需要根据 finalGrade 数组进行排序。

static void sort(String[] students, int[][] grades, double[] finalGrade) {
        double tempFG;
        String tempStud;
        int t;

        //Bubble Sort
        for (int i=0; i<students.length-1; i++) {
            for (int j=0; j<finalGrade.length-i-1; j++) { 
                if (finalGrade[j] < finalGrade[j+1]) { 
                    tempFG = finalGrade[j];
                    tempStud = students[j];
                    finalGrade[j] = finalGrade[j+1];
                    students[j] = students[j+1];
                    finalGrade[j+1] = tempFG;
                    students[j+1] = tempStud;
                }
           }
        } 
} 

如果您必须以这种方式进行排序,那么对二维数组进行排序并不比对任何其他数组进行排序困难。您必须记住,二维数组只是数组的数组。也就是说,就像对待数组中的任何其他对象一样对待内部数组。

    static void sort(String[] students, int[][] grades, double[] finalGrade) {
        double tempFinalGrade;
        String tempStudent; //I think using well descriptive vars is better
        int [] tempGrade;
        
        //Bubble Sort
        for (int i=0; i<students.length-1; i++) {
            for (int j=0; j<finalGrade.length-i-1; j++) {
                if (finalGrade[j] < finalGrade[j+1]) {
                    tempFinalGrade = finalGrade[j];
                    tempStudent = students[j]; 
                    tempGrade = grades[j];//addition

                    finalGrade[j] = finalGrade[j+1];
                    students[j] = students[j+1];
                    grades[j] = grades[j+1]; //addition

                    finalGrade[j+1] = tempFinalGrade;
                    students[j+1] = tempStudent;
                    grades[j+1] = tempGrade; //addition
                }
            }
        }
    }

我会说我认为这根本不是解决这个问题的好方法。将其抽象为 class 会好得多。

如评论中所述,对二维数组进行排序的更好、更简洁的方法是对编号为 0n-1 的索引数组进行排序,其中 n 是项目总数。

然后在最后,使用索引指向,甚至重新生成二维数组。

static void sort(String[] students, int[][] grades, double[] finalGrade) {
        int tempIndex;
        int[] indices = new int[finalGrade.length];
        for (int i = 0; i < finalGrade.length; ++i)
           indices[i] = i;

        //Bubble Sort
        for (int i=0; i<students.length-1; i++) {
            for (int j=0; j<finalGrade.length-i-1; j++) { 
                if (finalGrade[indices[j]] < finalGrade[indices[j+1]]) { 
                    tempIndex = indices[j];
                    indices[j] = indices[j+1];
                    indices[j+1] = tempIndex;
                }
           }
        } 

    // Output results 
    for (int i = 0; i < indices.length; ++i)
      System.out.println(students[indices[i]] + "  " + finalGrade[indices[i]]);
} 

请注意,您不必交换多个数组,因为索引数组指向已排序的项目。

如前所述,如果要交换的项目较少,排序索引会更容易。但更好的做法是:

  • 使用 class(同样建议)。
  • 实施快速排序或等效(或使用 API 中的排序)。

这是一些数据。成绩和期末成绩没有关系。

String[] students = {"John", "May", "Helen", "Jim", "George"};
int[][] grades = {{88,97},{100,84},{80, 85},{92,91},{91,78}};
double[] finalGrade = {88.5, 92.6, 85.2, 89.3, 91.3}; 

现在排序并打印

int indices[] = sort(students, grades, finalGrade);
for (int i = 0; i < indices.length; i++) {
        int k = indices[i];
        System.out.printf("%6s -  %f  - %s%n",students[k], 
               finalGrade[k], Arrays.toString(grades[k])); 
}

打印

   May -  92.600000  - [100, 84]
George -  91.300000  - [91, 78]
   Jim -  89.300000  - [92, 91]
  John -  88.500000  - [88, 97]
 Helen -  85.200000  - [80, 85]


  • 此方法 returns 用于打印结果的索引。如果使用了 class 那么索引排序就不需要了。然后可以返回对象列表或数组。

  • 0 to length of arrays初始化索引列表。

  • 这与任何冒泡排序或选择排序的工作方式相同,除了使用索引数组索引到 finalGrade 数组,并根据比较结果交换索引。

static int[] sort(String[] students, int[][] grades, double[] finalGrade) {
  
    //Bubble Sort
    int[] indices = new int[grades.length];
    Arrays.setAll(indices, i->i);

    for (int i=0; i<students.length-1; i++) {
        for (int j=i+1; j<finalGrade.length; j++) { 
            if (finalGrade[indices[i]] < finalGrade[indices[j]]) {
                int t = indices[j];
                indices[j] = indices[i];
                indices[i] = t;
            }
       }
    }
    return indices;
}

以上其实是一个selection sort的变体。您的循环参数不起作用,您的实现还有其他问题。您仍然可以将以上内容应用于 Bubble-sort