【发布时间】:2011-07-07 06:40:41
【问题描述】:
什么是自然排序。假设我有一个 Employee 对象,其中包含姓名、年龄和加入日期,按什么自然排序排序?
【问题讨论】:
什么是自然排序。假设我有一个 Employee 对象,其中包含姓名、年龄和加入日期,按什么自然排序排序?
【问题讨论】:
对于包含数字的字符串,它表示1,2,3,4,5,6,7,8,9,10,11 而不是1,10,11,2,3,4,5,6,7,8,9
【讨论】:
自然排序是一种对人类来说很自然的字母数字排序。
在经典的字母数字排序中,我们将有类似的内容:
1 10 11 12 2 20 21 3 4 5 6 7
如果您使用自然排序,它将是:
1 2 3 4 5 6 7 10 11 12 20 21
根据语言,自然排序有时会忽略大写字母和重音字母(即,所有重音字母都被视为非重音字母)。
许多语言都具有自然排序字符串的功能。但是,Employee 对于语言来说太“高级”了,你必须决定对你来说自然排序并创建相应的函数意味着什么。
在我看来,排序 Employee 将首先使用自然排序按姓名排序,然后是年龄,最后是加入日期。
根据统计数据,有两种类型的分类变量。具有没有数字顺序的类别的变量(名义)和那些确实具有有序类别的变量(序数)。员工姓名、年龄和加入日期的示例实际上被视为名义变量,因此不能按自然顺序排序。例如,如果您将年龄分类为儿童、青少年、成人等级别,自然排序可能存在,在其中可以观察到升序排序。
【讨论】:
Comparable#compareTo 方法强加的顺序,但在人类看来.
如果像我这样的人发现自己正在阅读以下文章:
https://www.copterlabs.com/natural-sorting-in-mysql/
(顺便说一句,这真的很有用),小心它,因为这是另一种排序方法。
一个正确的自然排序算法规定您按字母顺序排序,但是当您遇到一个数字时,您会将该数字和所有后续数字作为单个字符进行排序。
自然排序与先按字符串长度排序,然后在两个字符串长度相同时再按字母排序无关。虽然我链接的文章很有趣,但不要犯我犯的错误,认为这是自然排序的正确方法。
【讨论】:
对于Java来说,Comparable接口提供的排序称为自然排序,所以Comparator接口提供的,可以说是一种非自然排序。
【讨论】:
一个很老的问题,但很简单地说,Natural Order 是可比较元素的可枚举集合的升序:
1, 2, 3...
A, B, C...
【讨论】: