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