繁体   English   中英

关于一维arrays和Java排序的问题

[英]Questions about one dimensional arrays and sorting in Java

我目前在计算机科学 class 的后半部分,但我无法在第一个之后立即参加第二个。 所以我忘记了我的大部分编码知识。 我正在尝试重新学习这一切,但如果不一直回到基础,这将非常困难。

我目前正在处理的一项任务是要求我执行以下操作:

设计一个解决方案,请求和接收学生姓名和每个学生的考试成绩。 使用一维 arrays 来解决这个问题。 程序应该继续接受姓名和分数,直到用户输入一个名字为“alldone”的学生。 输入完成后,确定哪个学生的分数最高,并显示该学生的姓名和分数。 最后按升序对姓名列表和对应分数进行排序。

我不太确定如何组织和启动它,但我继续前进并开始编写一些代码,以至少取得一些进展并可能想出一些办法。

我设置程序的方式并没有完全响应提示,因为我正在尝试数组长度和 for 循环以重新熟悉。

所以我的问题是,当用户键入“alldone”时,我将如何做到这一点,程序停止输入并计算仅使用 1D Arrays 的人的最高等级。

是否可以将名称作为字符串,然后将字符串插入数组?

到目前为止,这是我的代码,这不是作业要寻找的,但我只是想从我可以做的一些事情上获得一些灵感:

public static void main(String[] args) {
    int studentcount;
    Scanner input = new Scanner(System.in);
    Scanner sc= new Scanner(System.in);
    
    //Input to set array length
    System.out.println("How many students are you grading? ");
    studentcount=sc.nextInt();

    //One dimensional array to hold student names/grades
    String [] names = new String [studentcount+1];
    int [] grades = new int [studentcount];
    
    //Input to record student names/grades
    System.out.println("Please enter the name of the students ");
    for (int i = 0; i < names.length; i++) {
        names[i] = sc.nextLine();
    }
    System.out.println("Please enter the grades of the students ");
    for (int i = 0; i < grades.length; i++) {
        grades[i] = sc.nextInt();
    }
    
    // For loop to display student names and grades
    for (int i = 0; i < studentcount; i++) {
    System.out.println(names[i+1] + " " + grades[i]);
}}}

output 看起来像这样:

How many students are you grading? 
3
Please enter the name of the students 
John
Brett
Wendy
Please enter the grades of the students 
10
20
30
John 10
Brett 20
Wendy 30

您应该创建一个 class 并像这样实现 Comparable 接口。 我在这里设置它的方式,它按名称排序。 如果要按分数排序,只需注释掉名称比较并取消注释等级比较。

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

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

public String getName() {
    return name;
}

public int getGrade() {
    return grade;
}

@Override
public int compareTo(Student o) {
    //sorting by name
    return name.compareTo(o.name);
    //Compare by grade -- reversed so it's highest first
    //return Integer.compare(o.grade, grade);
}

@Override
public String toString() {
    return "Student [name=" + name + ", grade=" + grade + "]";
}

public static void main(String[] args) {
    try (Scanner input = new Scanner(System.in)) {
        Student [] students = new Student[0];
        
        while(true) {
            System.out.println("Please enter the name of the student or \"alldone\" if complete: ");
            String name = input.next();
            if (name.contentEquals("alldone")) {
                break;
            }
            System.out.println(String.format("Please enter %s's grade: ", name));
            int grade = input.nextInt();
            input.reset();
            
            students = Arrays.copyOf(students, students.length+1);
            students[students.length-1] = new Student(name, grade);
        }

        Arrays.sort(students);

        for (Student student : students) {
            System.out.println(student);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

输入学生人数并用关键字表示输入结束是没有意义的。 由于您必须键入"alldone"才能停止输入,因此(对我而言)暗示您必须首先过度分配 arrays。 我选择3用于演示目的。 如果需要更多输入,arrays 可以进行调整,如图所示。 此示例仅说明如何获取数据并填充 arrays。 它不涉及排序机制,因为这不是您问题的一部分。

int studentCount = 0;
Scanner input = new Scanner(System.in);

// allocate space for three students
String[] names = new String[3];
int[] grades = new int[3];

int maxInput = names.length;
System.out.println(
        "Please enter name and grade of student (e.g. john 23)\non each line.");

// now enter the student and their grade
for (int i = 0; i < maxInput; i++) {
    
    String name = input.next();

    // this is where you check for the keyword to signal
    // end of input
    if (name.equals("alldone")) {
        break;
    }
    names[studentCount] = name;
    grades[studentCount++] = input.nextInt();

    // if you have maxed out your arrays you need to copy
    // the contents to a larger array
    if (studentCount == maxInput) {
        // increase array size
        maxInput += 3;  // increase by 3.
        names = Arrays.copyOf(names, maxInput);
        grades = Arrays.copyOf(grades, maxInput);
    }
}

// once here, the input part is over.  This displays the entered data
for (int i = 0; i < studentCount; i++) {
    System.out.println(names[i] + " " + grades[i]);
}

请注意,此时您的 arrays 可能会包含可能影响您的排序(并可能导致错误)的提取空间。 您可以像以前一样使用Arrays.copyOf修剪多余的空间,指定学生的数量。

或者,如果您使用自己的例程进行排序,则可以使用studentCount而不是 arrays 的长度来忽略多余的空间。

我认为您的教授想要数量不定的学生及其成绩。 因此,您会将所有内容放在一个不断获取输入的 while 循环中,然后如果其中一个输入是“alldone”,您可以退出 while 循环。 因此,请尝试重新构建您的代码,使其尽可能多地使用而不是您定义的数字。 然后你就可以进行排序了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM