gpt4 book ai didi

java - 在嵌套类中实现的比较器接口(interface)

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:23:05 25 4
gpt4 key购买 nike

我是 stackoverflow.com 的新手,但我经常在遇到问题时使用它来搜索答案,但现在我找不到任何搜索我的问题的结果,所以我在这里问 :)我正在学习 OCPJP SE 7 认证,考试 1Z0-804,我正在使用一本书(只有一本可用的 afaik,Ganesh\Sharma 的一本)在集合章节中,关于 Comparator 接口(interface),这本书提供了使用 Comparator 和 Comparable 接口(interface)对 Student 元素数组进行排序的示例,但问题是关于 Comparator 的:

import java.util.*;

class Student implements Comparable<Student> {
private String id, name;
private Double cgpa;
public String getName() {
return name;
}
public String getId() {
return id;
}
public Double getCgpa() {
return cgpa;
}
public Student(String studentId, String studentName, double studentCGPA) {
id=studentId;
name=studentName;
cgpa=studentCGPA;
}
public String toString() {
return id+" "+name+" "+cgpa;
}
public int compareTo(Student that) {
return this.id.compareTo(that.id);
}
}

class StudentCGPA implements Comparator<Student> {
public int compare(Student s1, Student s2) {
return s1.getCgpa().compareTo(s2.getCgpa());
}
}

class MyMainClass {
public static void main(String[] args) {
Student[] students = { new Student("cs011", "Lennon", 3.1),
new Student("cs021", "McCartney", 3.4),
new Student("cs012", "Harrison", 2.7),
new Student("cs022", "Starr", 3.7),
};
Arrays.sort(students, new StudentCGPA());
System.out.println(Arrays.toString(students));
}
}

因此它创建了一个新类,仅用于将 Comparator 接口(interface)与两个 Student 对象一起使用,但我认为这非常不舒服,所以我想知道:为什么我不能使用嵌套类(在 Student 中)?像这样:

import java.util.*;

class Student implements Comparable<Student> {
private String id, name;
private Double cgpa;
public String getName() {
return name;
}
public String getId() {
return id;
}
public Double getCgpa() {
return cgpa;
}
public Student(String studentId, String studentName, double studentCGPA) {
id=studentId;
name=studentName;
cgpa=studentCGPA;
}
public String toString() {
return id+" "+name+" "+cgpa;
}
public int compareTo(Student that) {
return this.id.compareTo(that.id);
}
static class StudentCGPA implements Comparator<Student> {
public int compare(Student s1, Student s2) {
return s1.getCgpa().compareTo(s2.getCgpa());
}
}
}

class MyMainClass {
public static void main(String[] args) {
Student[] students = { new Student("cs011", "Lennon", 3.1),
new Student("cs021", "McCartney", 3.4),
new Student("cs012", "Harrison", 2.7),
new Student("cs022", "Starr", 3.7),
};
Arrays.sort(students, new Student.StudentCGPA());
System.out.println(Arrays.toString(students));
}
}

这本书没有提到使用嵌套类而不是普通类,但我不明白为什么这样做不好……我的代码(第二个)有什么问题吗?我应该按照书上说的去做,因为我对 Comparator 的实现是错误的吗? (注意:代码编译和运行没有问题,在两种情况下都有预期的输出)

[cs012 Harrison 2.7, cs011 Lennon 3.1, cs021 McCartney 3.4, cs022 Starr 3.7]

请帮忙 :D 提前致谢。

最佳答案

您可以将 Comparator 实现为被比较对象的静态嵌套类,如果您控制该类(并且如果它是一个类而不是一个接口(interface))。然而,您想要根据目标类本身不支持的顺序(无论是 Comparable 还是通过提供一个 Comparator 类)。在这种情况下,您必须创建自己的、单独的 Comparator

即使您控制了一切,是否将 Comparator 实现为顶级类在某种程度上也是个人喜好问题。我不确定您为什么称其为“不舒服”;我自己,我通常更愿意尽可能避免嵌套类。还要注意,无论是否嵌套,Comparator 实现类都会被编译成一个单独的类文件。

关于java - 在嵌套类中实现的比较器接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26237242/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com