【问题标题】:How do I sort two arrays relative to each other?如何相对于彼此对两个数组进行排序?
【发布时间】:2021-02-12 10:08:58
【问题描述】:

我正在尝试制作一个学生成绩计划,其中有 2 个数组:String[] Student 和 double[] Grade。 我将它们克隆为一个已排序的数组和一个未排序的数组。

数组:

public class Testcode {
    public static void main(String[] args) {
        String ArrN[] = {"Garcia", "Magsilang", "Magbag"};
        double ArrG[] = {2.5, 1.25, 1.5};

        String ArrN2[] = ArrN.clone();
        double ArrG2[] = ArrG.clone();

        Arrays.sort(ArrN2);
        Arrays.sort(ArrG2);

        System.out.println(Arrays.toString(ArrN1));
        System.out.println(Arrays.toString(ArrN2));
        System.out.println(Arrays.toString(ArrG2));
        System.out.println(Arrays.toString(ArrG2));
    }
}

现在,我如何制作如下图所示的输出(按等级排序)

- 1.25               Magsilang
- 1.5                Magbag
- 2.5                Garcia

或(学生排序)

- Garcia             2.5
- Magbag             1.5
- Magsilang          1.25

【问题讨论】:

  • 为什么不创建一个StudentGrade 类来将姓名和成绩放在一个地方
  • 我实际上已经创建了一个类来容纳数组,但我的问题是这样的让我们说 Array1 = "SA","SB",SC" //StudentName Array2 = 1.0,3.0,5.0 / /学生成绩输出应按最高成绩排序,同时在数组的同一索引上显示对应名称 1.0 = SA 3.0 = SC 5.0 = SB
  • 维护两个独立数组之间的顺序真的很烦人。您最好的选择是创建一个专门的类来存储这两个东西(单个学生的姓名和成绩)并拥有这些对象的数组。然后,您可以根据需要按名称或等级对其进行排序,并始终获取其他相关数据。
  • 然后创建一个studentgrade.class然后将它继承到main.class会解决问题吗?如果是这样,那么是否有我可以依据的代码?

标签: java arrays sorting


【解决方案1】:

因为您不只是单独处理姓名和成绩。我建议为您的问题创建一个StudentGrade 类,如下所示:

private static class StudentGrade {
    String name;
    double grade;

    public StudentGrade(String n, double g) {
        this.name = n;
        this.grade = g;
    }
}

您可以创建一个 StudentGrade[] 数组,并使用适合您用例的任何字段对其进行排序。我用namegrade 对其进行了排序,我能够看到预期的输出;

StudentGrade[] studentGrades = new StudentGrade[] {
        new StudentGrade("Garcia", 2.5),
        new StudentGrade("Magsilang", 1.25),
        new StudentGrade("Magbag", 1.5)
};

// Sort By Name
System.out.println("(Student Sorted):");
Arrays.sort(studentGrades, Comparator.comparing(o -> o.name));
printStudentGrades(studentGrades);

// Sort by Grade
System.out.println("(Grade Sorted):");
Arrays.sort(studentGrades, Comparator.comparing(o -> o.grade));
printStudentGrades(studentGrades);

这会打印这个输出:

(Student Sorted):
Garcia 2.5
Magbag 1.5
Magsilang 1.25
(Grade Sorted):
Magsilang 1.25
Magbag 1.5
Garcia 2.5

【讨论】:

  • 好的,谢谢,我肯定会在我的代码中尝试这个并进行试验。
  • 好的,请在您尝试时告诉我它是否适合您的用例。
  • 好的,我会在我确认它在我的 switch-case 语句中工作后更新你,再次感谢
  • 它适用于 switch-case 参数,但稍作调整。总体而言,该程序有效。
【解决方案2】:

正如其他人所说,如果你有一个单独的类 StudentGrade,它包含名称和等级,然后你利用已经实现的算法 Collections.sort,它从 Java 8 接受你的类的方法引用,这更有意义.

代码如下:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

class StudentGrade {

    private String name;
    private double grade;

    public StudentGrade(String name, double grade) {
        this.name = name;
        this.grade = grade;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getGrade() {
        return grade;
    }

    public void setGrade(double grade) {
        this.grade = grade;
    }
}

public class Testcode {

    public static void main(String[] args) {

        List<StudentGrade> students = new ArrayList<>();

        students.add(new StudentGrade("Garcia", 2.5));
        students.add(new StudentGrade("Magsilang", 1.5));
        students.add(new StudentGrade("Magbag", 1.25));

        Collections.sort(students, Comparator.comparing(StudentGrade::getGrade));
        System.out.println("Grade Sorted");
        for (StudentGrade studentGrade : students) {
            System.out.println(studentGrade.getGrade() + " " + studentGrade.getName());
        }

        Collections.sort(students, Comparator.comparing(StudentGrade::getName));
        System.out.println("\nStudent Sorted");
        for (StudentGrade studentGrade : students) {
            System.out.println(studentGrade.getName() + " " + studentGrade.getGrade());
        }

    }
}

输出是:

Grade Sorted
1.25 Magbag
1.5 Magsilang
2.5 Garcia

Student Sorted
Garcia 2.5
Magbag 1.25
Magsilang 1.5

【讨论】:

  • 好的,谢谢,我一定会在我的代码中尝试这个并进行试验
  • 不客气。您介意投票并接受答案吗?那将不胜感激。谢谢。
【解决方案3】:

我已尝试获取您的第二个输出。使用Bubble sort对数组进行排序!

class TestCode {
    public static void main(String[] args) {
        String ArrN[] = {"Garcia", "Magsilang", "Magbag"};
        double ArrG[] = {2.5, 1.25, 1.5};

        //bubble sort based on ArrG array
        for (int i = 0; i < ArrG.length - 1; i++) {
            for (int j = 0; j < ArrG.length - i - 1; j++) {
                if (ArrG[j] < ArrG[j + 1]) {
                    double temp = ArrG[j];
                    ArrG[j] = ArrG[j + 1];
                    ArrG[j + 1] = temp;

                    String tempN = ArrN[j];
                    ArrN[j] = ArrN[j + 1];
                    ArrN[j + 1] = tempN;
                }
            }
        }

        // print the array
        for (int i = 0; i < ArrG.length; i++) {
            System.out.println(ArrN[i] + " " + ArrG[i]);
        }
    }
}

输出:

Garcia 2.5
Magbag 1.5
Magsilang 1.25

这是一个基本的方法!您还可以使用Class 或内置的Array() 方法!

【讨论】:

    【解决方案4】:

    要获得两个数组相对于彼此的排序副本,您可以首先成对链接这些数组的元素,然后对这些对进行排序 - 你得到一个排序列表。作为每对的容器,您可以使用Map.Entry、数组或某些。例如:

    String[] arrN = {"Garcia", "Magsilang", "Magbag"};
    double[] arrG = {2.5, 1.25, 1.5};
    
    List<Map.Entry<String, Double>> list = IntStream
            // assuming the two arrays are the same length,
            // iterate over the indices of the first array
            .range(0, arrN.length)
            // link a pair of two elements
            .mapToObj(i -> Map.entry(arrN[i], arrG[i]))
            // collect a list of map entries
            .collect(Collectors.toList());
    
    // sort by name
    list.sort(Map.Entry.comparingByKey());
    list.forEach(System.out::println);
    //Garcia=2.5
    //Magbag=1.5
    //Magsilang=1.25
    
    // sort by grades
    list.sort(Map.Entry.comparingByValue());
    list.forEach(System.out::println);
    //Magsilang=1.25
    //Magbag=1.5
    //Garcia=2.5
    

    另见:How do I relate one array input to another?

    【讨论】:

      猜你喜欢
      • 2012-04-30
      • 1970-01-01
      • 2014-07-22
      • 2020-09-27
      • 2013-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多