我需要对文件内容进行实现排序。
文件的每一行都包含下一个数据:Instructor, Course, Group, Student, Result
并且可以为同一个学生包含很少的结果。
例如:
Paul Schwartz,Introduction to Computer Architecture,I1,Ben Dunkin,88
Muhamed Olji,Object Oriented Programming,I4,Mike Brown,73
...
Paul Schwartz,Introduction to Computer Architecture,I1,Ben Dunkin,96
我需要为每位教师实施
Student - Result
(降序); Student
本课程的结果较高。 我从文件中读取并创建了类Item
:
class Item {
private String instructor;
private String course;
private String group;
private String student;
private int result;
// and add appropriate public getters/setters
}
在java中,我们可以使用以下两个选项之一对该类的所有元素进行排序:类实现Comparable
接口并覆盖compareTo() method
或使用外部Comparator
接口与{{ 1}}。但是我们如何使用这些选项对不同的排序查询进行排序。
compare() method
来满足此要求(或更好compareTo()
)?答案 0 :(得分:2)
您应该让类实现Comparable,它有一个compareTo
方法,就像String
一样。
所以你的自定义比较器看起来像这样:
public class CustomComparator implements Comparator<Item> {
@Override
public int compare(Item i1, Item i2) {
return i1.compareTo(i2);
}
}
(compare()
方法必须返回int
,因此您无法直接返回boolean
。)
您需要在overwrite
类中CompareTo
Item
方法,您可以在其中定义应比较哪些属性。
因为您想要对不同的选项进行排序,您需要多重比较方法和多个比较器。比你只需要打电话给他们你需要的。
您的排序代码就像这样:
Collections.sort(YourObejctList, new CustomComparator());
答案 1 :(得分:2)
Item
的比较器将使用以下比较:
public class CustomComparator implements Comparator {
public int compare(Object aObjectOne, Object aObjectTwo) {
Item objectOne = (Item) aObjectOne;
Item objectTwo = (Item) aObjectTwo;
int cmpinstr = objectOne.getInstructor().compareTo(objectTwo.getInstructor());
if (cmpinstr != 0) // different instructor
return cmpinstr;
int cmpcourse = objectOne.getCourse().compareTo(objectTwo.getCourse());
if (cmpcourse != 0) // different course
return cmpcourse;
int cmpgroup = objectOne.getGroup().compareTo(objectTwo.getGroup());
if (cmpgroup != 0) // different group
return cmpgroup;
// sorting by result.
if (objectOne.getResult() < objectTwo.getResult())
return -1; // i1 has lower result than i2
else if (objectOne.getResult() > objectTwo.getResult())
return 1; // i1 has higher result than i2
return 0; // i1 and i2 have the same result
}
}
要获得前五名,只需排序并选择您收藏的最后五名学生。
如果您想根据组,教师,课程或结果过滤数据,您可以使用一些自定义过滤器循环访问该集合。