美好的一天 -
我正在处理一项任务,其中我指示创建一个名为void sortByAthleteNames()
的方法,该方法将执行以下任务:
按名字和姓氏对运动员对象列表进行排序。此方法调用Sorts类中定义的sort方法,使用AthleteNameComparator类的对象作为其第二个参数
排序类具有以下实现:
public class Sorts {
public static void sort(ArrayList<Athlete> objects,Comparator<Athlete> comparator)
{
//TODO
}
}
您的排序方法使用参数Comparator对象的compare方法进行排序。您可以使用选择排序或插入排序。
sortByAthleteNames()方法实现:
public void sortByAthleteNames() {
AthleteNameComparator athleteNameComparator = new AthleteNameComparator();
Sorts.sort(athleteList, **CONFUSED WHAT TO PASS HERE**);
}
而 AthleteNameComparator 类具有以下指令:
AthleteNameComparator类实现&#34; Comparator&#34;接口。 它需要定义以下方法,该方法是Comparator接口的继承抽象方法:
public int compare(Object first,Object second) (注意,您还可以定义: public int compare(运动员第一名,运动员第二名) 而是通过使类实现Comparator。
为此我创建了一个类如下:
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。
我在这里感到很困惑。我的问题是如何执行关系运算符,因为lastName的datatype
为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()
方法得到成功的响应时,我怎么能在Insertion或Selection sort中使用返回的值。
非常感谢
答案 0 :(得分:1)
使用比较器进行排序是Java中的标准操作。有关它的工作原理以及compare
方法必须返回负/正/ 0值的原因,请在网络和/或教科书中查找教程和其他资源。
要求一个特定的班级名称AthleteNameComparator
真的很愚蠢,但假设这是一个学校作业,你可能应该去做。
对sort的调用很简单:
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()
只能用几行代码编写,包括比较器(假设是Java 8):
public void sortByAthleteNames() {
Sorts.sort(athleteList, Comparator.comparing(Athlete::getLastName).thenComparing(Athlete::getFirstName));
}
如果我理解正确,你仍然可以在你面前完成大部分工作:实施Sorts.sort()
。如果您从使用e1 < e2
比较元素的排序算法开始,则必须将其替换为comparator.compare(e1, e2) < 0
。始终使用与原始算法相同的关系运算符,它应该顺利进行。
希望它有所帮助。