1

我需要对文件内容进行排序。

File 的每一行都包含下一个数据: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以及本课程成绩更高的 前 5 名。

我从文件中读取并创建了类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接口compare() method。但是我们如何使用这些选项对不同的排序查询进行排序。

  • 如何使用compareTo()来满足这个要求(或更好compare())?
4

2 回答 2

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。)

比您需要类中overwriteCompareTo方法,您Item可以在其中定义应比较的属性。

因为要对不同的选项进行排序,所以需要多个比较方法和多个比较器。比你只需要按你的需要打电话给他们。

您的排序代码将是这样的:

Collections.sort(YourObejctList, new CustomComparator());
于 2013-08-06T17:58:32.657 回答
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
  }
}

要获得前五名,只需从您的收藏中排序并选择最后五名学生。

如果您想根据小组、讲师、课程或结果过滤数据,您可以使用一些自定义过滤器循环访问集合。

于 2013-08-06T17:59:40.713 回答