11

我想按出生年份降序排列我的数组。我的数组有两个其他元素,它们是字符串类型的。因此,例如,出生在最早年份(例如 1939 年)的人将在顶部,然后以此类推。

这是我的代码:

import java.util.*;
public class StudentInformationTest
{
public static void main (String [] args){ 
    StudentInformation[] studentInfo = new StudentInformation[10];

    studentInfo[0] = new StudentInformation("Student A",1971, "BSc FDIT");
    studentInfo[1] = new StudentInformation("Student B",1964, "BSc FDIT"); 
    studentInfo[2] = new StudentInformation("Student C",1996, "BSc FDIT"); 
    studentInfo[3] = new StudentInformation("Student D",1939, "BSc FDIT"); 
    studentInfo[4] = new StudentInformation("Student E",1945, "BSc FDIT"); 
    studentInfo[5] = new StudentInformation("Student F",1991, "BSc FDIT"); 
    studentInfo[6] = new StudentInformation("Student G",1987, "BSc FDIT"); 
    studentInfo[7] = new StudentInformation("Student H",1968, "BSc FDIT"); 
    studentInfo[8] = new StudentInformation("Student I",1968, "BSc FDIT"); 
    studentInfo[9] = new StudentInformation("Student J",1973, "BSc FDIT"); 

    printInfo(studentInfo);
    printAge(studentInfo);
}
public static void printInfo(StudentInformation studentInfo[]){
    for(int i = 0; i < studentInfo.length; i++){
        System.out.println(studentInfo[i].getStudentName() + " " +   studentInfo[i].getBirthDate() + " " + studentInfo[i].getProgrammeOfStudy());
    }
    System.out.println();
}

 }

}

一旦我设法按降序打印出生年份,我还需要显示学生姓名和他们正在做的大学模块。我知道其他问题已经被问到如何做到这一点,但我无法看到其他对象。这是一堂课,所以请原谅我的代码中的任何错误。

4

3 回答 3

32

使用一个Comparator和一个ArrayList

在 Java 8 中

使用新的默认和静态方法Comparator

ArrayList<StudentInformation> infos = new ArrayList<StudentInformation>();
// fill array
Collections.sort(infos, 
    Comparator.comparingInt(StudentInformation::getBirthYear).reversed());

这是一个勇敢的新世界!:)

或者——仍然比 Java 7 更好——使用lambdas

ArrayList<StudentInformation> infos = new ArrayList<StudentInformation>();
// fill array
Collections.sort(infos, (s1, s2) ->
    Integer.compare(s2.getBirthYear(), s1.getBirthYear()));

在 Java 7 中

使用匿名内部类。

class StudentDateComparator implements Comparator<StudentInformation> {
    public int compare(StudentInformation s1, StudentInformation s2) {
        return Integer.compare(s2.getBirthYear(), s1.getBirthYear());
    }
}

ArrayList<StudentInformation> infos = new ArrayList<StudentInformation>();
// fill array
Collections.sort(infos, new StudentDateComparator());

解释

它的Comparator作用是允许任何东西比较给定类型的两个对象(在本例中为StudentInformation)。您也可以制作StudentInformationimplement Comparable<StudentInformation>,但这种方式可能更好,因为有不止一种方法可以比较学生信息(按日期,如这里,但也可以按名字、姓氏、注册的课程数量等)。

通过交换比较器中s1和的顺序s2,我们得出相反的顺序。另一种方法是compare按正常顺序否定调用,或者使用正常的比较器并将其包装在Collections.reverseOrder.


您也可以使用标准数组来执行此操作。

StudentInformation[] infos = new StudentInformation[10];
// fill array
Arrays.sort(infos, new StudentDateComparator());
于 2013-03-10T19:09:25.130 回答
1

在 Java 领域,有Comparable<E> 接口

interface Comparable<E> {
  public int compareTo(E other);
}

您应该根据您的要求制作您的StudentInfoimplement Comparable<StudentInfo>compareTo(StudentInfo other)并使用标准库中的方法(但这将需要 aComparator代替)或一些适合您情况的排序算法。

于 2013-03-10T19:12:40.160 回答
1

你可以让StudentInformation类实现Comparable。然后你必须实现一个方法compareTo。此方法定义如何以及何时将类的两个对象视为相等、更小或更大。

明确定义此属性后,您可以使用Collections.sort实用程序对集合进行排序。

于 2013-03-10T19:14:06.270 回答