首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Comparator<T>

使用Comparator<T>
EN

Stack Overflow用户
提问于 2016-10-15 07:55:02
回答 1查看 1.1K关注 0票数 0

日安-

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

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

排序类有以下实现:

代码语言:javascript
复制
public class Sorts {

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

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

sortByAthleteNames()方法实现:

代码语言:javascript
复制
public void sortByAthleteNames() {
        AthleteNameComparator athleteNameComparator = new AthleteNameComparator();      
        Sorts.sort(athleteList, **CONFUSED WHAT TO PASS HERE**);
    }

AthleteNameComparator类有以下指令:

AthleteNameComparator类实现“比较器”接口。它需要定义以下方法,它是从比较器接口继承的抽象方法:

公共int比较(对象第一,对象第二)(注意,您也可以定义:公共int比较(运动员第一,运动员第二),取而代之的是使类实现比较器。

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

AthleteNameComparator

代码语言:javascript
复制
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。我已经搜索了很多,根据我的理解,这就是我可以比较这些。请确认这是正确的方法吗?

代码语言:javascript
复制
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()方法获得成功的响应时,如何在插入或选择排序中使用返回的值。

非常感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-15 09:12:45

使用比较器进行排序是Java中的一项标准工作。关于它是如何工作的,以及为什么compare方法必须返回负/正/0值,请在网络和/或教科书中找到教程和其他资源。

要求一个特定的类名(如AthleteNameComparator )是非常愚蠢的,但假设它是一项学校作业,您可能应该使用它。

对排序的调用很简单:

代码语言:javascript
复制
    Sorts.sort(athleteList, athleteNameComparator); // **SEE WHAT TO PASS HERE**

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

代码语言:javascript
复制
@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):

代码语言:javascript
复制
public void sortByAthleteNames() {
    Sorts.sort(athleteList, Comparator.comparing(Athlete::getLastName).thenComparing(Athlete::getFirstName));
}

如果我的理解是正确的,那么您前面还有大部分工作要做:实现Sorts.sort()。如果从比较使用(例如e1 < e2 )的元素的排序算法开始,则必须用comparator.compare(e1, e2) < 0替换它。始终使用与原始algoritm相同的关系运算符,并且应该顺利进行。

希望能帮上忙。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40056568

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档