gpt4 book ai didi

java - 使用比较器

转载 作者:行者123 更新时间:2023-12-01 09:22:45 24 4
gpt4 key购买 nike

美好的一天-

我正在执行一项任务,其中我有指令创建一个名为 void sortByAthleteNames() 的方法,该方法将执行以下任务:

按名字和姓氏对运动员对象列表进行排序。此方法调用 Sorts 类中定义的排序方法,使用 AthleteNameComparator 类的对象作为其第二个参数

Sorts 类具有以下实现:

public class Sorts {

public static void sort(ArrayList<Athlete> objects,Comparator<Athlete> comparator)
{
//TODO
}
}

您的排序方法利用参数 Comparator 对象的比较方法来排序。您可以使用选择排序或插入排序之一。

sortByAthleteNames()方法实现:

public void sortByAthleteNames() {
AthleteNameComparator athleteNameComparator = new AthleteNameComparator();
Sorts.sort(athleteList, **CONFUSED WHAT TO PASS HERE**);
}

AthleteNameComparator 类具有以下指令:

AthleteNameComparator 类实现“Comparator”接口(interface)。它需要定义以下方法,该方法是从 Comparator 接口(interface)继承的抽象方法:

public int Compare(对象第一,对象第二)(请注意,您还可以定义:public int Compare(运动员第一,运动员第二)相反,让类实现 Comparator。

为此,我创建了一个类,如下所示:

运动员姓名比较器

public class AthleteNameComparator implements Comparator<Athlete>{

@Override
public int compare(Athlete o1, Athlete o2) {
// TODO Auto-generated method stub
return 0;
}
}

此外,我们还有以下指令,我们需要用相同的方法来实现它,如下所示:

如果第一个参数对象的姓氏按字典顺序小于第二个参数的姓氏,则返回小于零的 int。如果第一个参数对象的姓氏按字典顺序大于第二个参数的姓氏,则返回大于零的 int。如果他们的姓氏相同,那么应该比较他们的名字。如果他们的名字和姓氏相同,则应返回 0。

我在这里很困惑。我的问题是如何执行关系运算符,因为 LastName 的 datatypeString 并返回 -1/1 或 0。我已经搜索了很多,根据我的了解这就是我可以比较这些的方式。请确认这是正确的方法吗?

public class AthleteNameComparator{

public int compare(Athlete a1, Athlete a2) {

if(a1.getLastName().hashCode() < a2.getLastName().hashCode())
{
return -1;
}
else if(a1.getLastName().hashCode() > a2.getLastName().hashCode())
{
return 1;
}
else if(a1.getLastName().hashCode() == a2.getLastName().hashCode())
{
if(a1.getFirstName().hashCode() == a2.getFirstName().hashCode())
{
return 0;
}
}
return 100;
}
}

但是我们为什么要这样做呢?我们用 -1/1 或 0 可以实现什么。您还可以解释一下它是如何工作的吗?我需要首先处理哪些事情,当我从 compare() 方法获得成功响应时,我如何在插入或选择排序中使用返回的值。

非常感谢

最佳答案

使用比较器进行排序是 Java 中的标准操作。了解其工作原理以及原因 compare方法必须返回负/正/0 值,在网络和/或教科书中查找教程和其他资源。

要求特定的类名确实很愚蠢,如 AthleteNameComparator ,但假设这是一项学校作业,您可能应该按照它去做。

排序的调用很简单:

    Sorts.sort(athleteList, athleteNameComparator); // **SEE WHAT TO PASS HERE**

你的骨架AthleteNameComparator是正确的。您可以填写如下方法:

@Override
public int compare(Athlete o1, Athlete o2) {
int diffLastName = o1.getLastName().compareTo(o2.getLastName());
if (diffLastName == 0) { // last names are equal
return o1.getFirstName().compareTo(o2.getFirstName());
} else {
return diffLastName;
}
}

一旦掌握了窍门,编写比较器就很容易了:您只需将任务传递(委托(delegate))给适当的compareTo即可。 (很少使用另一个比较器的 compare 方法),它将返回正确的负值、正值或 0 值。只要将左侧 ( o1 ) 和右侧 ( o2 ) 保持在正确的位置,您甚至不必跟踪哪个是哪个。

如果不是类名的要求,sortByAthleteNames()只需几行代码即可编写,包括比较器(假设是 Java 8):

public void sortByAthleteNames() {
Sorts.sort(athleteList, Comparator.comparing(Athlete::getLastName).thenComparing(Athlete::getFirstName));
}

如果我理解正确的话,您面前仍然有大部分工作:实现Sorts.sort() 。如果您从使用 e1 < e2 比较元素的排序算法开始,您必须将其替换为 comparator.compare(e1, e2) < 0 。始终使用与原始算法相同的关系运算符,它应该会顺利进行。

希望有帮助。

关于java - 使用比较器<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40056568/

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