我在完成工作时遇到了麻烦,因为我不知道如何按升序和降序等级对名称进行排序。我希望你们能帮忙。
import java.util.Scanner;
public class SortingStudents {
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
System.out.print("Enter the number of students: ");
int capacity = s.nextInt();
String [] name = new String[capacity];
Double [] grade = new Double[capacity];
for(int i = 0; i < capacity; i++) {
System.out.print("student's name: ");
name [i] = s.next();
System.out.print("grade: ");
grade [i] = s.nextDouble();
}
Scanner input = new Scanner(System.in);
System.out.println("Type A for Ascending D for Descending:");
char a=input.nextLine().charAt(0);
if(a == 'A' || a == 'a'){
for(int i = 0; i<grade.length;i++){
System.out.println(grade[i]+"\t" +grade[i]);
}
}
}
答案 0 :(得分:3)
您正在使用Java,这是一种面向对象的编程语言。这意味着您可以根据代表问题域中状态的类来考虑您的问题,并具有操纵此状态的行为(方法)。
在这种情况下,您的代码会显示几种责任,您可以为其创建有用的类和/或方法:
想到的类名是:DataEntry,Student,StudentRegistry。为了以不同的方式对学生进行排序,标准方法是创建一个Comparator类,见下文。
这些类看起来大致如下:
public class Student {
private String name;
private Double grade;
// getters and setters ommitted for brevity
}
注册表:
public class StudentRegistry {
// it's easier to use a List because you are adding students one by one
private List<Student> students;
public StudentRegistry(int capacity) {
// ...constructor code initializes an instance of StudentRegistry
}
public void addStudent(Student student) {
// add a student to the list
}
public Student[] getStudents(Comparator<Student> comparator) {
// sort the list using the comparator and Collections.sort()
// use List.toArray() to convert the List to an array
// alternatively (java 8) return a Stream of Students
// or return an unmodifiable List (using Collections.unmodifiableList())
// you don't want to expose your modifiable internal List via getters
}
}
可以对升序或降序进行排序的比较器。您可以考虑添加按等级或名称排序的功能,这很容易。
public class StudentComparator implements Comparator<Student> {
public enum Direction {
ASCENDING, DESCENDING
}
// optional addition:
//public enum Field{
// NAME, GRADE
//}
// if used, add Field parameter to the constructor
public StudentComparator(Direction direction) {
// initialize instance
}
@Override
public int compare(Student a, Student b) {
// implement Comprator method, see JavaDoc
}
@Override
public boolean equals(Object o) {
// implement equals, see JavaDoc
}
}
让用户输入数据的类:
public class DataEntry {
public int getNumberOfStudents() {
// ...
}
public Student getStudent() {
// ...
}
public StudentComparator.Direction getSortingDirection() {
// ...
}
}
还有一个主要课程:
public class Main {
public static void main(String[] args) {
DataEntry dataEntry = new DataEntry();
int capacity = dataEntry.getCapacity();
StudentRegistry studentRegistry = new StudentRegistry(capacity);
for(int i=0; i<= capacity; i++) {
studentRegistry.addStudent(dataEntry.getStudent());
}
StudentComparator comparator = new StudentComparator(dataEntry.getSortingDirection());
Student[] students = studentRegsitry.getStudents(comparator);
}
}
这种方法将问题的关注点分离在单独的类和方法中,使代码更容易理解,调试和测试。
例如,要测试Main类,您可以设置一个模拟DataEntry类,为您的测试提供预定值。请参阅单元测试主题。
答案 1 :(得分:0)
您可以将名称和等级连接起来并对它们进行排序,这样可以轻松实现。
答案 2 :(得分:0)
如果您想按照自己的方式进行操作,而无需更改数组的存储方式。您将无法使用Arrays.sort()方法对成绩进行排序,因为这不会考虑名称数组,并且您将失去它们之间的链接,以使成绩不再与名称匹配。
您可以非常快速地编写自己的冒泡分拣机以快速对数组进行排序,然后您可以使用循环同时影响名称数组。但是,如果您不想编写自己的分拣机代码,则需要组织您的成绩和名称数组,以便可以将其视为一个单元,即在单独的类中。
如果您选择编码自己的分拣机,那么这里有一个很好的链接可以了解:http://www.java-examples.com/java-bubble-sort-example
如果您选择更改存储成绩和名称的方式,以下是使用Arrays.sort()方法的方法: http://www.homeandlearn.co.uk/java/sorting_arrays.html