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

collections.sort()方法未正确拾取重载方法

吕钧
2023-03-14

我的目标是对名单上的人进行排序。我使用比较器接口的比较方法。

我已经创建了三个类。即

Person.java, AgeComparator.java, SortingExample.java

Person类是一个简单的类,包含两个字段(name、age),也包含getters。然后,在我的AgeComaparator类中,我实现了比较器接口,并将Person类作为类型参数传递。

package com.nadee.module3;

import java.util.Objects;

public class Person {

    private final String name;
    private final int age;

    public Person(String name, int age) {
        Objects.requireNonNull(name);
        this.name = name;
        this.age = age;
    }


    public String getName() {
        return name;
    }
    public int getAge() {
        return age;
    }


    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }


    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Person other = (Person) obj;
        if (age != other.age)
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        return true;
    }


    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }
}

ageComparator.java

package com.nadee.module3;

import java.util.Comparator;

public class AgeComparator implements Comparator<Person>{

    @Override
    public int compare(Person left, Person right) {
        return Integer.compare(left.getAge(), right.getAge());
    }

}

排序Example.java

package com.nadee.module3;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import com.nadee.collections.Person;

public class SortingExample {
    public static void main(String[] args) {


    Person p1 = new Person("will smith", 45);
    Person p2 = new Person("john snow", 33);
    Person p3 = new Person("johny depth", 55);

    List<Person> actors = new ArrayList<Person>();

    actors.add(p1);
    actors.add(p2);
    actors.add(p3);

    System.out.println(actors);

    Collections.sort(actors, new AgeComparator());

    System.out.println(actors);

    }
}

我将Eclipse IDE用于此应用程序,在

sort 

共有1个答案

夏侯衡
2023-03-14

类Person位于com.nadee.module3,类AgeComparator用于此类Person

但是在类排序示例中,您使用了com.nadee.collections.Person中的Person。应该完全不行。您的代码的另一个要点:

  • 请使用actors.sort(new AgeComparator());,集合sort太常见
 类似资料:
  • 我有字符串的比较器,它被转换成日期。当我将这个比较器传递给集合时。sort()方法我得到了java。lang.IllegalArgumentException:比较法违反其总合同!。 我读过一些关于这个例外的文章,但我真的不明白为什么会出现这个例外。知道吗?

  • 问题内容: 这个问题应该比关于更多。 我有一个子类(在python 2.7中,numpy 1.6.2),并且我发现在对象时未列出的字段名称(因此,ipython的自动完成功能无效)。 为了修复它,我尝试在子类中重写,如下所示: 结果是:。(我发现这里实际上应该在python 3.3中工作…) 作为一种解决方法,我尝试了: 据我所知,这是可行的,但当然并不优雅。 问题: 后一种解决方案对我而言是否正

  • 问题内容: 我正在编写一个程序,该程序将协调实时数据库中的最终交易。我正在进行的工作无法作为set操作完成,因此我使用了两个嵌套游标。 我在对每个客户端进行协调时需要对事务表进行排它锁,但是我想释放该锁,并让其他人在我处理的每个客户端之间运行查询。 我想在行级别而不是表级别上执行排他锁,但是到目前为止,我读到的内容说如果其他事务在隔离级别上运行(这对我来说),我将无法执行。 我是否正确获取了表级互

  • 所以我有一个Java应用程序,它使用一个固定的线程池来执行一些代码。此代码包括使用输出到系统的第三方库。犯错误当我让这段代码执行单线程时,我“重定向”了系统。错误为最终打印到log4j日志的打印流。基本上是这样的: 这按预期工作。输出打印到日志文件而不是控制台,我可以通过更改log4j配置完全删除输出。完美。 当我开始添加多线程时,我做了一些研究,遇到了这样一个问题:在多线程Java程序中,每个线

  • 重载子类中重写的方法,我是重载父方法还是重载子类方法? 我大体上理解什么是超载和超驰。 重载-同一方法在同一个类中有不同的参数和可能的返回类型。 重写-子类中的方法签名与父类中的方法签名相同,但实现不同。 方法B.a(INTX)是重载a.a还是重载B.a?

  • Java 允许同一个类中定义多个同名方法,只要它们的形参列表不同即可。 如果同一个类中包含了两个或两个以上方法名相同的方法,但形参列表不同,这种情况被称为方法重载(overload)。 例如,在 JDK 的 java.io.PrintStream 中定义了十多个同名的 println() 方法。 这些方法完成的功能类似,都是格式化输出。根据参数的不同来区分它们,以进行不同的格式化处理和输出。它们之