【问题标题】:Is the term "natural ordering" specific to Java?术语“自然排序”是 Java 特有的吗?
【发布时间】:2017-03-01 18:58:12
【问题描述】:

教程Object Ordering引用了“自然排序”的概念:

如果 List 由 String 元素组成,它将被排序为 按字母顺序。如果它由 Date 元素组成,它将被排序 按时间顺序。这是怎么发生的?字符串和日期 实现 Comparable 接口。可比较的实现提供 一个类的自然排序,它允许该类的对象 被自动排序。下表总结了一些 实现 Comparable 的更重要的 Java 平台类。

术语“自然排序”是 Java 特有的,还是与语言无关的?例如,我可以谈谈 Ruby 中的“自然排序”吗?

(注意:我说的不是Natural sort order,在Jeff Atwood 的博文Sorting for Humans : Natural Sort Order 中提到)

【问题讨论】:

  • 我想这可能会变得很哲学。
  • 该术语与语言无关,该术语在Java中的含义特定于到Java。
  • 一些讨论暗示该术语在this question中被用于其他语言。
  • 语言规范 v8 中“自然顺序”一词仅出现一次。
  • @ruakh 令人沮丧的是,我认为问题本身是在谈论我想要的那种“自然排序”,但答案却谈到了“另一种”。

标签: java terminology


【解决方案1】:

这不是对自然排序类型的引用,其中字符串中的数字“自然”排序,而不是按字典顺序逐位排序。 Java 对该术语的定义不同。

让我们改变重点:

Comparable 实现为类提供了一种自然的排序,它允许该类的对象自动排序。

“自然”一词意味着如果您实现Comparable,那么您的类的用户可以轻松对其进行排序,而无需自定义比较器。排序是自然的;它是内置的;它是免费的,无需思考。

术语“自然排序”是 Java 特有的,还是与语言无关的?

是的。不,两者都有?它是特定于 Java 的,因为文档用斜体表示该术语并且有一个 naturalOrder method。当然,这个概念也适用于其他语言。

例如,我可以谈谈 Ruby 中的“自然排序”吗?

你可以。如果你说的是袖手旁观,你可以使用这个词。如果你是正式写作,那么定义它是谨慎的。由于与 Atwood 对该术语的使用混淆,我更喜欢使用不同的术语。说,“默认排序”。

【讨论】:

    【解决方案2】:

    我相信这个词在 Java 中有特定的含义

    至少在官方文档中。

    来自Comparable 接口的 API 文档:

    此接口对实现它的每个类的对象进行总排序。这种排序称为类的自然排序,类的 compareTo 方法称为其自然比较方法。

    如果我们非常熟悉 API 文档中的这一行。然后我们看到一个类实现了Comparable 接口,我们看到某处/有人提到了A 的两个实例的“自然顺序”,我们知道它可能是在谈论compareTo 方法强加的顺序。问题是,说/写该术语的人是否也知道这个特定含义并在上下文中使用它?

    当然,API 文档是这样使用该术语的,因为它所做的第一件事就是定义它。

    【讨论】:

      【解决方案3】:

      不,术语 自然排序 不是 Java 特定的。我的观点是它根本与编程语言无关。相反,很可能所有编程语言(尽管它们可能会或可能不会明确使用该术语)都依赖于这个概念。

      例如,如果没有自然排序的概念,max(a, b)a.after(b) 这样的方法将如何工作?我们知道整数的自然顺序:1, 2, 3, ...;日期 1/1/1990, 1/2/1990, 1/1/1991, ...;时间:12:00、12:01、1:01 ... 这些系统是人工定义的,但这是我们期望的。如果我们有许多整数 ordered 1, 3, 2, 4 这将是 unnatural

      您的引述,正如我所读到的那样,表明了这一点。实现Comparable 接口的类型提供“默认”、明确定义或预期的排序。对于开发人员定义的类型,由开发人员强制执行自然排序(就像 Java 开发人员对 Numbers 所做的那样)或定义自然排序,就像我们经常对自己的复杂类型所做的那样。

      当一个类实现Comparable 接口时,它提供了编译时(自然)顺序,只能通过提供自定义Comparator 来更改。尽管如此,我们可以在软件中表示的对象或系统数量有限,这些对象或系统具有真实、易于理解和接受的自然顺序。许多类型(例如 Student、Cars 和 Users)可能依赖于一个或多个属性来确定它们的顺序,这可能看起来一点也不自然。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-24
        • 2016-09-10
        • 1970-01-01
        • 2010-11-18
        • 1970-01-01
        • 2015-05-13
        • 2020-02-28
        相关资源
        最近更新 更多