【问题标题】:Collections.sort() method not picking up overload method correctlyCollections.sort() 方法没有正确选择重载方法
【发布时间】:2020-02-13 22:58:38
【问题描述】:

我的目标是对人员列表进行排序。我正在使用 Comparator 接口的 compare 方法。

我创建了三个类。即

Person.java、AgeComparator.java、SortingExample.java

Person 类是一个简单的类,它有两个字段(姓名、年龄),也有 getter。 然后在我的 AgeComaparator 类中,我实现了 Comparator 接口并将 Person 类作为 Type 参数传递。

然后重写来自 Comparator 接口的比较方法。

为了执行这个应用程序,在我的 SortingExample 中,我创建了 3 个 Person 类型的对象。 然后将这些对象添加到 Person 类型的 ArrayList 中。

然后调用带有两个参数的 Collections.sort() 方法。 这些是列表对象和实现 Comparator 接口的类。

Person.java

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());
    }

}

SortingExample.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,并且在

下显示了“红色”行
排序
方法。

错误是这样说的,

“Collections类型中的方法sort(List, Comparator)不适用于参数(List, AgeComparator)”

我已经关注了以下文章 https://www.journaldev.com/16094/java-collections-sort

我在这里做错了什么?任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 您导入了import com.nadee.collections.Person,但您向我们展示的 Person 类位于不同的包中 - com.nadee.module3。是错字吗?
  • 当所有 3 个类都在同一个包中时,此代码可以正常工作。
  • 换句话说,Agecomparator 是一个类...collections3.Person,而列表包含另一个类...collection.Person
  • 请注意,您可以使用Comparator.comparing(Person::getAge)
  • @Eran,是的,我从错误的包中导入。

标签: java generics collections


【解决方案1】:

Person 类位于 com.nadee.module3AgeComparator 类用于此类 Person

但在 SortingExample 类中,您使用的是来自 com.nadee.collections.Person 的 Person。它应该完全不起作用。 您的代码的另一点:

  • 请使用actors.sort(new AgeComparator());Collections.sort 太常用了

【讨论】:

  • 我真傻。谢谢@Tea NG,这是导入问题,我能够解决它。
  • Collections.sort 太常见”是什么意思?你是对的,你也可以直接调用List.sort,因为Collections.sort代表它;我只是不明白你所说的那句话是什么意思。
  • @AndyTurner。目前,我使用的是 Java 8。如果您还使用 Java 8,您将看不到 Collections.sort(自 jdk1.2 起)和 List.sort(自 jdk8 起)之间的区别。在 Java 旧版本中,Collections.sort 有点不同 查看 Java 7 的结帐链接。github.com/openjdk-mirror/jdk7u-jdk/blob/master/src/share/… 您可能会阅读此信息以查看更多信息:stackoverflow.com/a/34827492/2865414
  • @TeaNG 我在查询“太常见”这个词。为什么有些东西是“常见的”(这是“一般”还是“经常使用”的意思?)这很重要,是什么让它过度如此?
  • 在我看来,即使它只是一段代码“如果可以,一切都应该清楚”。有人查看并使用我的代码,他们可以随意做他们想做的事而无需担心。没有理由建议你应该使用你认为没有必要的东西,伙计。
猜你喜欢
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多