根据几个参数排序类内容

时间:2013-08-06 17:44:44

标签: java sorting collections comparison

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

文件的每一行都包含下一个数据: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(降序);
  • 和前5名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())?

2 个答案:

答案 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
  }
}

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

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