Java 将比较器与多个比较器一起使用

Java 将比较器与多个比较器一起使用,java,arrays,sorting,compare,comparator,Java,Arrays,Sorting,Compare,Comparator,我可以使用这段代码中的所有简单比较器进行排序,但不能使用ComplexComparator。我不知道如何编写代码使其正常工作。如有任何建议/解释,将不胜感激 这是我的主要节目: package pkgTest; import java.util.Arrays; public class Main { public static void main(String[] args) { Student[] students = new Student[6];

我可以使用这段代码中的所有简单比较器进行排序,但不能使用
ComplexComparator
。我不知道如何编写代码使其正常工作。如有任何建议/解释,将不胜感激

这是我的主要节目:

package pkgTest;

import java.util.Arrays;

public class Main {

    public static void main(String[] args) {
        Student[] students = new Student[6];
        students[0] = new Student("Pete", 1989, 3.6);
        students[1] = new Student("Tomas", 1989, 3.9);
        students[2] = new Student("Helen", 1990, 3.6);
        students[3] = new Student("Steve", 1991, 3.7);
        students[4] = new Student("Natalie", 1993, 3.7);
        students[5] = new Student("John", 1992, 4.0);

        NameComparator byName
                = new NameComparator();
        BirthDateComparator byBirthDate
                = new BirthDateComparator();
        AverageComparator byAverage
                = new AverageComparator();

        ComplexComparator complexSorting
                = new ComplexComparator(byName,
                        byAverage);

        System.out.println("===============");
        System.out.println("Before sorting:");
        System.out.println("===============");
        for (Student student : students) {
            System.out.println(student.getName()
                    + " // " + student.getBirthDate()
                    + " // " + student.getAverage());
        }

        Arrays.sort(students, complexSorting);

        System.out.println("==============");
        System.out.println("After sorting:");
        System.out.println("==============");
        for (Student student : students) {
            System.out.println(student.getName()
                    + " // " + student.getBirthDate()
                    + " // " + student.getAverage());
        }
    }
}
以下是其余的课程:

package pkgTest;

public class Student {

    private String name;
    private int birthDate;
    private double average;

    public Student(String name, int birthDate,
            double average) {
        this.name = name;
        this.birthDate = birthDate;
        this.average = average;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getBirthDate() {
        return this.birthDate;
    }

    public void setBirthDate(int birthDate) {
        this.birthDate = birthDate;
    }

    public double getAverage() {
        return this.average;
    }

    public void setAverage(double average) {
        this.average = average;
    }
}


package pkgTest;

import java.util.Comparator;

public class ComplexComparator implements Comparator<Student> {

    public ComplexComparator(Comparator<Student> one,
            Comparator<Student> another) {
    }

    @Override
    public int compare(Student one, Student another) {
        /*This is the part that
        I just couldn't figure
        it out to get it work.

        It has to work no matter
        which 2 of the 3 comparators
        I use to set the input
        parameters of ComplexComparator.

        I have to make it work by
        modifying only this part of
        the code.*/
    }
}


package pkgTest;

import java.util.Comparator;

public class AverageComparator implements Comparator<Student> {

    @Override
    public int compare(Student one, Student another) {
        if (one.getAverage()
                < another.getAverage()) {
            return -1;
        } else if (one.getAverage()
                == another.getAverage()) {
            return 0;
        } else {
            return +1;
        }
    }
}

package pkgTest;

import java.util.Comparator;

public class BirthDateComparator implements Comparator<Student> {

    @Override
    public int compare(Student one, Student another) {
        if (one.getBirthDate()
                < another.getBirthDate()) {
            return -1;
        } else if (one.getBirthDate()
                == another.getBirthDate()) {
            return 0;
        } else {
            return +1;
        }
    }
}


package pkgTest;

import java.util.Comparator;

public class NameComparator implements Comparator<Student> {

    @Override
    public int compare(Student one, Student another) {
        return one.getName().
                compareToIgnoreCase(another.getName());
    }
}
package-pkgTest;
公立班学生{
私有字符串名称;
私人生日;
私人双平均;
公立学生(字符串名称,整数生日,
双倍平均数){
this.name=名称;
this.birthDate=生日;
这个平均数=平均数;
}
公共字符串getName(){
返回此.name;
}
公共void集合名(字符串名){
this.name=名称;
}
public int getBirthDate(){
返回此项。生日;
}
公共无效设置起始日期(整数出生日期){
this.birthDate=生日;
}
公共双平均值(){
返回此值。平均值;
}
公众平均(双倍平均){
这个平均数=平均数;
}
}
包装包装测试;
导入java.util.Comparator;
公共类ComplexComparator实现Comparator{
公共复合体比较器(比较器1,
比较器(另一个){
}
@凌驾
公共整数比较(学生一,学生另一){
/*这就是
我就是不明白
这是为了让它工作。
不管怎样,它都必须起作用
3个比较器中的哪2个
我使用设置输入
ComplexComparator的参数。
我必须让它工作的时间
仅修改此部分
密码*/
}
}
包装包装测试;
导入java.util.Comparator;
公共类AverageComparator实现了Comparator{
@凌驾
公共整数比较(学生一,学生另一){
if(one.getAverage()
如下所示修改ComplexComparator

public class ComplexComparator implements Comparator<Student> {

private List<Comparator<Student>> listComparators;

     @SafeVarargs
    public ComplexComparator(Comparator<Student>... comparators) {
        this.listComparators = Arrays.asList(comparators);
    }

    @Override
    public int compare(Student studen1, Student studen2) {
        for (Comparator<Student> comparator : listComparators) {
            int result = comparator.compare(studen1, studen2);
            if (result != 0) {
                return result;
            }
        }
        return 0;
    }
}
公共类ComplexComparator实现Comparator{
私人名单比较者;
@安全变量
公共ComplexComparator(比较器…比较器){
this.listparators=Arrays.asList(comparators);
}
@凌驾
公共整数比较(学生1、学生2){
for(比较器比较器:列表比较器){
int结果=比较器。比较(studen1,studen2);
如果(结果!=0){
返回结果;
}
}
返回0;
}
}

如下所示修改ComplexComparator

public class ComplexComparator implements Comparator<Student> {

private List<Comparator<Student>> listComparators;

     @SafeVarargs
    public ComplexComparator(Comparator<Student>... comparators) {
        this.listComparators = Arrays.asList(comparators);
    }

    @Override
    public int compare(Student studen1, Student studen2) {
        for (Comparator<Student> comparator : listComparators) {
            int result = comparator.compare(studen1, studen2);
            if (result != 0) {
                return result;
            }
        }
        return 0;
    }
}
公共类ComplexComparator实现Comparator{
私人名单比较者;
@安全变量
公共ComplexComparator(比较器…比较器){
this.listparators=Arrays.asList(comparators);
}
@凌驾
公共整数比较(学生1、学生2){
for(比较器比较器:列表比较器){
int结果=比较器。比较(studen1,studen2);
如果(结果!=0){
返回结果;
}
}
返回0;
}
}

我不确定您希望如何呈现解决方案。但是根据我的理解,如果你想把代码放在注释的地方,你可以试着这样放代码

假设在比较名称后出现这种情况,如果相同,则表示您打算移动到平均值

public int compare(Student StOne, Student StAnother) {
     if(one.compare(Sone, Sanother)==0) {
         return another.compare(StOne, StAnother);
         }
     else 
         return one.compare(StOne, StAnother);
     }
但为此,您需要确保在ComplexComparator的构造函数中获取的值(byName,byAverage)应该是类的实例变量,并且需要在构造函数中初始化

公共类ComplexComparator实现Comparator{
私人比较一号;
私人比较机构;
公共复合体比较器(比较器1,
比较器(另一个){
这个。一=一;
这个。另一个=另一个;
}
@凌驾
公共整数比较(学生一,学生另一){
//上面给出的代码
} }

我不确定您希望如何呈现解决方案。但是根据我的理解,如果你想把代码放在注释的地方,你可以试着这样放代码

假设在比较名称后出现这种情况,如果相同,则表示您打算移动到平均值

public int compare(Student StOne, Student StAnother) {
     if(one.compare(Sone, Sanother)==0) {
         return another.compare(StOne, StAnother);
         }
     else 
         return one.compare(StOne, StAnother);
     }
但为此,您需要确保在ComplexComparator的构造函数中获取的值(byName,byAverage)应该是类的实例变量,并且需要在构造函数中初始化

公共类ComplexComparator实现Comparator{
私人比较一号;
私人比较机构;
公共复合体比较器(比较器1,
比较器(另一个){
这个。一=一;
这个。另一个=另一个;
}
@凌驾
公共整数比较(学生一,学生另一){
//上面给出的代码
} }

您必须修改类
ComplexComparator
,至少如下所示

import java.util.Comparator;

public class ComplexComparator implements Comparator<Student> {

    private Comparator<Student> comparatorOne;
    private Comparator<Student> comparatorTwo;

    public ComplexComparator(Comparator<Student> one,
            Comparator<Student> another) {
        this.comparatorOne = one;
        this.comparatorTwo = another;
    }

    @Override
    public int compare(Student one, Student another) {
        // make a first comparison using comparator one
        int comparisonByOne = comparatorOne.compare(one, another);

        // check if it was 0 (items equal in that attribute)
        if (comparisonByOne == 0) {
            // if yes, return the result of the next comparison
            return comparatorTwo.compare(one, another);
        } else {
            // otherwise return the result of the first comparison
            return comparisonByOne;
        }
    }
}
只需使用这些值,并尝试进行一些修改,以熟悉有关比较和排序的常见问题。
我希望这会有帮助……

您必须修改该类<
public class ComplexComparator<T> implements Comparator<T> {

    private List<Comparator<T>> listComparators;

    @SafeVarargs
    public ComplexComparator(Comparator<T>... comparators) {
        listComparators = Arrays.asList(comparators);
    }

    @Override
    public int compare(T o1, T o2) {
        for (Comparator<T> comparator : listComparators) {
            int result = comparator.compare(o1, o2);
            if (result != 0) {
                return result;
            }
        }
        return 0;
    }
}
@SuppressWarnings("unchecked")
Comparator<MyClass> comparator = new ComplexComparator(
        MyClass.ComparatorA,
        MyClass.ComparatorB);

Collections.sort(mySet, comparator);