【问题标题】:how to make a generic comparator method如何制作通用比较器方法
【发布时间】:2015-04-05 13:48:56
【问题描述】:

我有一个实用程序类,我希望有一个通用的排序方法,以便将任何类型的 arrayList 传递给下面发布的这个静态方法, 将被排序。

当我写下面的代码时,eclipse要求添加未实现的方法,当我接受添加它们时,我发现它们太多了,我 不知道应该用哪个

代码

public static <T> void sortAsc(ArrayList<T> list) {
    Collections.sort(list, ascOrder);
}

private static Comparator<T> ascOrder = new Comparator<T>() {

    public int compare(DMatch arg0, DMatch arg1) {
        // TODO Auto-generated method stub

        return Float.compare(arg0.distance, arg1.distance);
    }
};

【问题讨论】:

  • 我不确定我是否完全理解你——你想编写一个辅助方法来获取任何类型的列表并对其进行排序?通过什么?
  • @yes,例如“距离”
  • 您使用的是 Java 8 吗?如果是这样,请查看接口Comparator。它现在包含许多返回 Comparator&lt;T&gt; 的静态方法。在您的示例中,您必须输入 Collections.sort(list, Comparator.comparingDouble(x-&gt;x.distance)) 或其他内容。
  • 如果没有类型限制,你怎么知道对象包含距离属性?
  • Java 8 中的Comparator 接口已经为这类事情提供了许多实用方法。例如,您可以这样做 Collections.sort(list, Comparator.comparing(DMatch::getDistance)));

标签: java list arraylist comparator


【解决方案1】:

要做你想做的事,你需要一个类型来确保会有一个getDistance() 方法。那可以是抽象类或接口。不管是哪一个,我都称它为 HasDistance。

public static void sortAsc(ArrayList<? extends HasDistance> list) {
    Collections.sort(list, ascOrder);
}

private static Comparator<HasDistance> ascOrder = new Comparator<>() {

    public int compare(HasDistance arg0, HasDistance arg1) {
        return Float.compare(arg0.getDistance(), arg1.getDistance());
    }
};

【讨论】:

  • ascOrder的返回类型应改为Comparator&lt;HasDistance&gt;。否则无法使用。
  • @pbabcdefp 我没有关注你。 ascOrder 不是方法,因此没有返回类型。
  • 你是对的。对不起。我的意思是它应该有类型Comparator&lt;HasDistance&gt;
【解决方案2】:

如果您想对“任何类型”进行排序,那么您需要选择适用于“任何类型”的内容。本质上,您想要对Object 的列表进行排序。这可能会限制您比较 myObject.hashCode()myObject.toString()。选择其中一个并始终如一地坚持下去。从这两种方法中得到的排序是否有用是一个完全不同的问题。

如果您可以使列表的内容不那么笼统,那么您将拥有更广泛的排序选项。

【讨论】:

    【解决方案3】:

    在 Java 8 之后,您可以只使用 yourList.sort(param)。 如果列表中的项目实现了 Comparable 接口,则方法参数可以是 Comparator 或 null。

    【讨论】:

      猜你喜欢
      • 2013-02-17
      • 1970-01-01
      • 2018-06-30
      • 1970-01-01
      • 1970-01-01
      • 2021-07-19
      • 2019-07-15
      • 2013-09-16
      • 1970-01-01
      相关资源
      最近更新 更多