日安-
我正在处理一个任务,在这个任务中,我有指令创建一个名为void sortByAthleteNames()的方法,它将执行以下任务:
根据名字和姓氏对运动员对象列表进行排序。此方法调用排序类中定义的排序方法,使用AthleteNameComparator类的一个对象作为其第二个参数。
排序类有以下实现:
public class Sorts {
public static void sort(ArrayList<Athlete> objects,Comparator<Athlete> comparator)
{
//TODO
}
}排序方法使用参数比较器对象的比较方法进行排序。您可以使用选择排序或插入排序之一。
sortByAthleteNames()方法实现:
public void sortByAthleteNames() {
AthleteNameComparator athleteNameComparator = new AthleteNameComparator();
Sorts.sort(athleteList, **CONFUSED WHAT TO PASS HERE**);
}而AthleteNameComparator类有以下指令:
AthleteNameComparator类实现“比较器”接口。它需要定义以下方法,它是从比较器接口继承的抽象方法:
公共int比较(对象第一,对象第二)(注意,您也可以定义:公共int比较(运动员第一,运动员第二),取而代之的是使类实现比较器。
为此,我创建了一个类,如下所示:
AthleteNameComparator
public class AthleteNameComparator implements Comparator<Athlete>{
@Override
public int compare(Athlete o1, Athlete o2) {
// TODO Auto-generated method stub
return 0;
}
}此外,我们还需要以下指令,以便用相同的方法实现这一点,这些指令如下:
如果第一个参数对象的姓氏在词汇上小于第二个参数,则返回小于零的int。如果第一个参数对象具有比第二个参数更大的姓氏,则返回大于零的int。如果他们的姓是一样的,那么他们的名字应该比较。如果他们有相同的名字和姓氏,那么应该返回0。
我在这里很困惑。我的问题是如何执行关系运算符,因为datatype的lastName是String并返回-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()方法获得成功的响应时,如何在插入或选择排序中使用返回的值。
非常感谢
发布于 2016-10-15 09:12:45
使用比较器进行排序是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;
}
}一旦掌握了它的诀窍,编写比较器就很容易了:只需将任务传递(委托)给适当的compareTo (很少会传递给另一个比较器的compare方法),它将返回正确的负值或正值或0值。您甚至不需要跟踪哪个是只要您保持左手侧(o1)和右手侧(o2)在正确的位置。
如果不是因为类名的要求,sortByAthleteNames()可以只使用几行代码编写,包括比较器(假设Java8):
public void sortByAthleteNames() {
Sorts.sort(athleteList, Comparator.comparing(Athlete::getLastName).thenComparing(Athlete::getFirstName));
}如果我的理解是正确的,那么您前面还有大部分工作要做:实现Sorts.sort()。如果从比较使用(例如e1 < e2 )的元素的排序算法开始,则必须用comparator.compare(e1, e2) < 0替换它。始终使用与原始algoritm相同的关系运算符,并且应该顺利进行。
希望能帮上忙。
https://stackoverflow.com/questions/40056568
复制相似问题