使用比较器<t>

时间:2016-10-15 07:55:03

标签: java arrays sorting comparator

美好的一天 -

我正在处理一项任务,其中我指示创建一个名为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的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()方法得到成功的响应时,我怎么能在Insertion或Selection sort中使用返回的值。

非常感谢

1 个答案:

答案 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。始终使用与原始算法相同的关系运算符,它应该顺利进行。

希望它有所帮助。