当前位置: 首页 > 知识库问答 >
问题:

使用比较器

明财
2023-03-14

日安-

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

public class Sorts {

    public static void sort(ArrayList<Athlete> objects,Comparator<Athlete> comparator)
    {
        //TODO
    }
}
public void sortByAthleteNames() {
        AthleteNameComparator athleteNameComparator = new AthleteNameComparator();      
        Sorts.sort(athleteList, **CONFUSED WHAT TO PASS HERE**);
    }

public int compare(Object first,Object second)(请注意,您还可以定义:public int compare(Attory first,Attory second),方法是让类

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

AthletenameComparator

public class AthleteNameComparator implements Comparator<Athlete>{

    @Override
    public int compare(Athlete o1, Athlete o2) {
        // TODO Auto-generated method stub
        return 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个答案

蒋啸
2023-03-14

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

要求一个特定的类名(如AthleteNameComparator)确实很愚蠢,但是假设这是一个学校作业,那么您可能应该使用它。

对排序的调用很简单:

    Sorts.sort(athleteList, athleteNameComparator); // **SEE WHAT TO PASS HERE**
@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;
    }
}
public void sortByAthleteNames() {
    Sorts.sort(athleteList, Comparator.comparing(Athlete::getLastName).thenComparing(Athlete::getFirstName));
}

希望能有所帮助。

 类似资料:
  • 我正在我的类Employee中实现Comparator和Comparable来排序ArrayList。我在2个参数名称和ID排序。当使用collections.sort(Employee ob1,Employee ob2)进行ID排序时,它不起作用。我得到一个编译错误,即类没有声明为弃权,也没有重写compare(),尽管我是这样做的: 如果我使用 我的疑问是,既然员工也是一个对象,为什么早先的不

  • 我有一个比较器,它检查字符串是否为空,并返回-1。如果它们不是null,则进行比较。我想用lambda函数实现这个。 以下是代码: 我知道如何使用lambdas返回一个简单的比较器。我对如何实现上述代码感到困惑。

  • 谁能解释一下为什么下面的代码不起作用: 但这一个有效: 换句话说,与创建普通类实例相比,接口实现何时是可互换的?当我使用compareTo()方法时会出现错误,该方法是Comparable接口的一部分,由所有包装类(如整数)实现。 所以我猜

  • 我的程序实现了一个类,其对象包含以下实例变量:、、和。 在对链接列表执行任何其他操作之前,我需要对产品的链接列表进行排序。 我想先按优先级(从最低到最高)对列表进行排序。如果优先级相同,请查看价格(从低到高),然后查看名称(按字母顺序)。 我做了很多关于、和的阅读。我相信我需要使用接口并实现一个方法。我的想法是,因为、和都有一个“自然”排序,所以使用更有意义。 然后当我想对我的LinkedList

  • 问题内容: 无论如何,要使下面的代码仍然使用开关,而不返回它,是吗?谢谢! 当然,如果使用if语句,您将像这样: 但是对于更复杂的示例,这变得很冗长。 问题答案: 抱歉,根据switch()文档 ,您不能在switch语句中使用比较: 请注意,开关/外壳确实比较松散。 这意味着您必须提出解决方法。从松散的比较表 ,你可以利用的事实是类型转换错误:

  • 测试代码(只是为了遵守SSCCE,显然有更好的方法来改变您自己的不区分大小写的数据模型) 比方说,我希望我的类实现遵循API中建议的强烈建议: 强烈建议,但不是严格要求(x.compareTo(y)==0) == ( x.equals(y))。 那么在中使用可以吗?当然,我们正在确保不会调用作为回报。 类似:什么时候包括什么?