【问题标题】:How to sort an array list of different object types using Comparable interface如何使用 Comparable 接口对不同对象类型的数组列表进行排序
【发布时间】:2016-05-21 20:58:29
【问题描述】:

这是课堂作业的一部分,我不知道这句话对挽救我自己的生命意味着什么。

public static <T extends Comparable<? super T>> void sort(Arraylist<T> list){}

该方法没有实现,因为我应该自己做。要排序的列表将包含Integer 类型、Double 类型和String 类型。

我到底应该如何使用Comparable 对不同对象类型的列表进行排序,Comparable&lt;? super T&gt; 到底是什么意思?

我的课本非常模糊和深奥,而且这个陈述非常具体,我不知道在互联网上哪里可以找到它。

编辑:

好的,我终于明白了说明=(我不必对不同项目类型的列表进行排序。我应该对相同项目类型的三个不同列表进行排序。但我还是不明白

Comparable&lt;? super T&gt;

【问题讨论】:

  • 你为什么要将不同的对象类型存储在一个列表中?!
  • 排序的逻辑是什么?
  • 你将如何对Integers、Doubles 和Strings 进行排序? “Bob the Builder”是大于 17.43 还是小于它?
  • @Prexx 我不知道!因为据我所知,它在说明中。
  • 他没有在数组列表中接收不同的对象,他正在接收类型为 T 的数组列表。T 可以是任何类型的对象,而不是不同对象的混合。

标签: java


【解决方案1】:

因此,如果我理解正确,您可以为通用排序方法创建一个实现。

如果你用一个满是字符串的arraylist调用'sort'方法,该方法将对这些字符串进行排序:

public static <String> void sort(Arraylist<String> list){}

如果您使用一个充满长值的数组列表调用相同的方法,它将对长值进行排序:

public static <Long> void sort(Arraylist<Long> list){}

您不会使用 long 对字符串进行排序。

另一个泛型方法的示例可能是:

public static <T> void print(T object){
    System.out.println(object.toString());
}

public static <T extends Comparable<? super T>> void sort(Arraylist<T> list){}

更新:

你想要一个扩展 T 的泛型

<T extends Comparable<>

Comparable 还需要一个泛型类型,它是您的第一个泛型类型的超类。

<? super T>

【讨论】:

  • 谢谢,我终于明白这个问题了。我无法理解声明 &lt;T extends Comparable&lt;? super T&gt;&gt;
  • 您需要一个扩展 T 的泛型类型(),而 Comparable 还需要一个泛型类型,它是您的第一个泛型类型的超类。查看我的更新
  • &lt;T extends Comparable&lt;? super T&gt;&gt; 可以读作:T 扩展了 Comparable 的类型,该类型是 T 的超类型。见this
【解决方案2】:

你得到的列表只包含一个类型T,你知道TComparable&lt;? super T&gt;的一个子类型。

因此,如果您将使用 Comparable&lt;T&gt; 的子类型,事情将非常简单:您知道您的类型具有可用于排序的 compareTo(T t) 方法。

但想象一下,您将java.sql.Timestamp 类型作为您的T。它没有实现Comparable&lt;Timestamp&gt;,而是Comparable&lt;Date&gt;。所以它有一个方法compareTo(Date)。不过,这不是问题,因为TimestampDate,所以您仍然可以使用该方法比较两个Timestamps。但是在签名中有Comparable&lt;T&gt; 不允许传递ArrayList&lt;Timestamp&gt;,它太严格了。

这正是给定签名不仅允许Comparable&lt;T&gt; 的子类,而且还允许Comparable&lt;? super T&gt; 的子类作为列表元素的原因。这涵盖了像 Timestamp 示例这样的情况,因为 supertypes 的比较函数足以满足您的目的。

如果您想了解有关此想法的更多信息,请搜索“矛盾”。

【讨论】:

  • 好的,谢谢。所以Timestamp 扩展了DateTimestamp 没有它自己的compareTo 方法。因此,我必须指定我可以使用Date 中的compareTo 方法。或多或少是这个想法吗?
  • 是的,就是这样。 Timestamp 实际上有自己的compareTo(Date) 实现,但这是一个实现细节。顺便说一句,Java API 的这一部分被广泛认为是一个设计缺陷(例如,data.compareTo(timestamp) 可以在timestamp.compareTo(date) 不给出结果时给出 0,datetimestamp 的值相同)。
猜你喜欢
  • 2013-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-19
  • 2020-02-23
  • 2013-04-17
  • 2016-04-17
相关资源
最近更新 更多