我正在研究使用以下标准对Student对象数组进行排序的项目:
1.Sort成绩
2.如果成绩相同,请在StudentNumber上排序。
现在我使用Arrays.Sort(T [] a,Comparator<> c)方法工作了。 因为我认为这种排序方法很慢,我想使用Quicksort。
我得到了以下代码:
public static void quickSort(Student[] arr, int low, int high) {
if (arr == null || arr.length == 0) {
return;
}
if (low >= high) {
return;
}
// pick the pivot
int middle = low + (high - low) / 2;
Student pivot = arr[middle];
// make left < pivot and right > pivot
int i = low, j = high;
while (i <= j) {
while (arr[i].getCijfer() < pivot.getCijfer()) {
i++;
}
while (arr[j].getCijfer() > pivot.getCijfer()) {
j--;
}
if (i <= j) {
Student temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
i++;
j--;
}
}
// recursively sort two sub parts
if (low < j) {
quickSort(arr, low, j);
}
if (high > i) {
quickSort(arr, i, high);
}
}
更新比较器代码:
private static Comparator<Student> gradeComparator = new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
int compareTo = 0;
if (o1.cijfer > o2.cijfer) {
compareTo = -1;
} else {
if (o1.cijfer < o2.cijfer) {
compareTo = 1;
} else {
// als Studenten Grade gelijk, vergelijk op studenten Ldap
if (o1.cijfer == o2.cijfer) {
if (o1.studentnummer > o2.studentnummer) {
compareTo = -1;
} else {
compareTo = 1;
}
}
}
}
return compareTo;
}
};
这对Grades(cijfer)上的数组进行排序,但我仍然坚持在第二个排序标准的位置。请帮帮我!
亲切的问候
答案 0 :(得分:3)
此表达式:arr[i].getCijfer() < pivot.getCijfer()
而且:arr[j].getCijfer() > pivot.getCijfer()
是您问题的根源。您需要将这些提取到一个返回整数的函数中,实现如下:return Integer.compare( a.getCijfer(), b..getCijfer() );
。
但是你会注意到这只是一个比较器函数,所以你可以继续修改它,使其与你使用Arrays.sort()
比较器时的工作完全一样。
这解决了你的问题。
但是,请注意以下事项:
您怀疑Arrays.sort()
会比某些快速排序慢一点是完全没有根据的,很可能是假的。
您认为自己可以做一个表现优于Arrays.sort()
的自制快餐,很可能是假的。
如果你不知道如何让自制的快速排序按照你想要的方式排序,你必须要求stackoverflow,这没有什么不妥,但显然,排序是一个比你教授对你的期望更高级的话题。
答案 1 :(得分:0)
您需要将第二个标准放在比较两个Student
个实例的任何位置,例如
if (arr[i].getCijfer() < pivot.getCijfer()
|| (arr[i].getCijfer() == pivot.getCijfer()
&& arr[i].getStudentNumber() < pivot.getStudentNumber()))
但是,在此处添加多个条件并不方便,因此您最好介绍一种比较方法:
if (compare(arr[i], pivot) < 0)
然后将比较逻辑推入该方法,以便根据arr[i]
是否小于,等于或大于pivot
返回一些数字。
请注意,这基本上是Comparator
提供的内容:
class MyComparator implements Comparator<Student> {
@Override int compare(Student a, Student b) {
if (a.getCijfer() != b.getCijfer()) {
return // Some comparison of a.getCijfer() and b.getCijfer()
}
// Somehow compare student number.
}
}