对字符串数组和int数组进行排序

时间:2015-05-15 08:41:23

标签: java arrays sorting

我正在练习对数组进行排序,并且我已经成功地对字符串数组进行了排序。

我的小程序允许用户输入第一批学生,然后输入每个学生的姓名,最后输入每个学生的成绩。

但我也想对int studentGrade数组进行排序,以便打印输出中的成绩与学生匹配。在这里,我真的被困住了。有关详细说明,请参阅下面的方法:public void sortingAlgorithm

package assignment8exam;

import java.util.Scanner;
import java.util.Arrays;

/**
 *
 * @author Anders
 */
public class Course {

    Scanner sc = new Scanner(System.in);

    public void MainMenu() {

        System.out.println("Enter data about a student, start by entering how many");

        int numbers = sc.nextInt();// amount of student
        String studentNames[] = new String[numbers];
        int studentGrade[] = new int[numbers];
        for (int i = 0; i < numbers; i++) {

            System.out.println("Enter name of student");
            Scanner name = new Scanner(System.in);

            String names = name.nextLine();
            studentNames[i] = names;
        }

        for (int j = 0; j < numbers; j++) {

            System.out.println("Enter grade of student");
            Scanner gradeSc = new Scanner(System.in);

            int grade = gradeSc.nextInt();
            studentGrade[j] = grade;
        }

        sortingArray(studentNames);
        System.out.println("------------------------------------\n");
        sortAlgorithm(studentNames, studentGrade);
        System.out.println("What do you want");
        System.out.println("Exit application 1");
        System.out.println("Print out all names of the students 2");
        System.out.println("Print out all the grades of the students 3");
        System.out.println("Print out pairs consisting of “name­grade 4");
        System.out.println("Search for a student - 5");
        Scanner choice = new Scanner(System.in);
        int order = choice.nextInt();

        switch (order) {

            case 1:
                System.exit(1);

            case 2:
                PrintOutNames(numbers, studentNames);

            case 3:
                PrintOutGrades(numbers, studentGrade);

            case 4:
                PrintOutAll(numbers, studentGrade, studentNames);

            case 5:
                search(numbers, studentGrade, studentNames);

        }

    }

    public static void PrintOutNames(int numbers, String studentNames[]) {

        for (int i = 0; i < numbers; i++) {

            System.out.println(studentNames[i]);

        }
    }

    public static void PrintOutGrades(int numbers, int studentGrade[]) {

        for (int i = 0; i < numbers; i++) {

            System.out.println(studentGrade[i]);

        }

    }

    public static void PrintOutAll(int numbers, int studentGrade[], String studentNames[]) {
        System.out.println("--------------------------------------------------------\n");
        for (int i = 0; i < numbers; i++) {

            System.out.println("Name----> " + studentNames[i] + " grade ---> " + studentGrade[i]);

        }

    }

    public static void search(int numbers, int studentGrade[], String studentNames[]) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter name on student you want to search on ");
        String search = sc.nextLine();
        for (int i = 0; i < numbers; i++) {

            if (search.equals(studentNames[i])) {

                System.out.println("Yes we have a student named " + studentNames[i] + " with the Grade " + studentGrade[i] + " \n ");

            }

        }
    }

    public static void sortingArray(String studentNames[]) {

        Arrays.sort(studentNames);
        System.out.println("-------------\n" + Arrays.toString(studentNames));

    }

    public static void sortAlgorithm(String studentNames[], int studentGrade[]) {

        boolean flag = true;

        while (flag) {

            flag = false;

            for (int j = 0; j < studentNames.length - 1; j++) {

                for (int i = j + 1; i < studentNames.length; i++) {
                    if (studentNames[i].compareTo(studentNames[j]) < 0) {
                        String temp = studentNames[j];
                        studentNames[j] = studentNames[i];
                        studentNames[i] = temp;

                                                                                             // Here i want to place another array that sorts the grade?? how do i do that?
                    }

                }

                System.out.println(Arrays.toString(studentNames));
                System.out.println(Arrays.toString(studentGrade));

            }
        }
    }
}

6 个答案:

答案 0 :(得分:5)

您的方法存在的问题是学生姓名和成绩之间没有关系。如果您对姓名进行排序并对成绩进行排序,您最终会得到字母A成绩最低的学生。

如果这是一个java赋值,最好的方法是创建一个名为Student的数据结构(类),它具有名称和等级。

class Student{
 String name;
 int grade;
}

然后你不会有两个数组,一个有名字,另一个有成绩,但只有一个学生数组,你可以按等级,名称等对数组进行排序。

如果您想要一个更快的解决方案,那就是使用Map<String,Integer>这样的地图,其中包含每个学生的成绩。

如果要使用多个数组,可以使sortAlgorithm方法在两个数组中交换相同的索引(不仅在names数组中),这样您最终会得到按名称排序的等级。这是IMO最糟糕的方法,因为你过分依赖数组索引而不是在对象之间建立某种关系。

答案 1 :(得分:1)

如上所述,&#34;正确&#34;解决方案可能是创建一个Student对象并让它包含学生的姓名和成绩。但是,如果您确实需要两个单独的数组,则可以在名称数组上对等级数组执行相同的交换:

if (studentNames[i].compareTo(studentNames[j]) < 0) {
    String temp = studentNames[j];
    studentNames[j] = studentNames[i];
    studentNames[i] = temp;

    int tempGrade = studentGrade[i];
    studentGrade[j] = studentGrade[i];
    studentGrade[i] = tempGrade;
}

答案 2 :(得分:1)

在这种特殊情况下,解决方案相对容易。在这个地方,您可以交换两个学生姓名:

            for (int i = j + 1; i < studentNames.length; i++) {
                if (studentNames[i].compareTo(studentNames[j]) < 0) {
                    String temp = studentNames[j];
                    studentNames[j] = studentNames[i];
                    studentNames[i] = temp;


                }

            }

您还可以同时交换相应的成绩:

            for (int i = j + 1; i < studentNames.length; i++) {
                if (studentNames[i].compareTo(studentNames[j]) < 0) {
                    String temp = studentNames[j];
                    studentNames[j] = studentNames[i];
                    studentNames[i] = temp;

                    int tempGrade = studentGrades[j];
                    studentGrades[j] = studentGrades[i];
                    studentGrades[i] = tempGrade;
                }

            }

因此,每当您切换两个学生姓名时,您可以同时切换相应的成绩。这将使两个阵列保持同步。

但正如其他人一直在推荐的那样,更好的方法是创建一个代表学生的课程 - 无论是名字还是成绩。为什么?因为在现实世界中,学生可能有其他数据,例如不同科目及其匹配成绩,出勤记录,联系信息,无论大学需要什么。

必须将其添加到每个此类数据项的循环中将使其难以处理。如果您在一条记录中包含所有信息,则只需交换记录引用,然后将一起交换整个数据

这个基础类似于:

class Student implements Comparable<Student> {
   private String name;
   private int grade = 0;

   public Student( String name ) {
        this.name = name;
   }

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

   // In addition, you'll have getName(), getGrade(),
   // and possibly a good `toString()` for printing a
   // student record.

   @Override
   public int compareTo( Student otherStudent ) {
       return this.name.compareTo( otherStudent.name );
   }
}

现在您可以定义一个数组,例如:

Student[] students = new Students[numbers];

您可以使用Arrays.sort()直接对其进行排序,因为Student实现了Comparable,或者您可以使用自己的排序算法并使用compareTo方法。你的循环将是:

            for (int i = j + 1; i < students.length; i++) {
                if (students[i].compareTo(students[j]) < 0) {
                    Student temp = students[j];
                    students[j] = students[i];
                    students[i] = temp;

                }

            }

答案 3 :(得分:0)

你想要做的是根据我认为的学生阵列对年级数组进行排序,所以在你循环中,每当你换学生时,你想要改变成绩

for (int j = 0; j < studentNames.length - 1; j++) {

    for (int i = j + 1; i < studentNames.length; i++) {
        if (studentNames[i].compareTo(studentNames[j]) < 0) {
            String temp = studentNames[j];
            studentNames[j] = studentNames[i];
            studentNames[i] = temp;
            // Here i want to place another array that sorts the grade?? how do i do that?
            int tempGrade = studentGrades[j];
            studentGrades[j] = studentGrades[i]
            studentGrades[i] = temp
            }

      }

      System.out.println(Arrays.toString(studentNames));
      System.out.println(Arrays.toString(studentGrade));

}

这个设计不是很好,可能会从@Veselin Davidov的帐户中获取建议

答案 4 :(得分:0)

你的问题是当你对一个数组(比如你的学生名单)进行排序时,你的第二个数组不能以同样的方式跟上...... 苹果和橘子。

你有一些解决方案。现在想到的是使用地图将每个名称链接到其等级。你也可以使用POO并声明一个Studen对象,它实际上看起来更像是一个更好的解决方案,我会让你阅读Veselin的答案。

让我们看一下quickfix,因为我认为这就是你要寻找的原因:

对你的有点破解的代码个人解决方法是将交换功能更改为:

if (studentNames[i].compareTo(studentNames[j]) < 0) {
    String tmp = studentNames[j];
    studentNames[j] = studentNames[i];
    studentNames[i] = tmp;

    int tmpGrade = studentGrade[i];
    studentGrade[j] = studentGrade[i];
    studentGrade[i] = tmpGrade;
}

但是,我强烈建议使用类或地图。

答案 5 :(得分:0)

你应该有一个代表学生的抽象,例如

public class Student {
   Integer grade;
   String name;

   // getters and setters omitted

   }

然后,您将面临使用不同类型(整数和字符串)多次扩展Comparator接口的问题。在这一点上,请阅读:

Using Comparable for multiple dynamic fields of VO in java