问题标签 [natural-sort]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
14 回答
37144 浏览

sql-server - Microsoft SQL 2005 中的自然(人类字母数字)排序

我们有一个大型数据库,在该数据库上进行 DB 端分页。这很快,在几分之一秒内从数百万条记录中返回一页 50 行。

用户可以定义自己的排序,基本上是选择要排序的列。列是动态的——一些具有数值、一些日期和一些文本。

虽然大多数按预期排序,但文本以一种愚蠢的方式排序。好吧,我说愚蠢,这对计算机有意义,但会让用户感到沮丧。

例如,按字符串记录 id 排序会给出如下结果:

...等等。

我希望这考虑到这个数字,所以:

我无法控制输入(否则我只会在前导 000 中格式化)并且我不能依赖单一格式 - 有些是“{alpha code}-{dept code}-{rec id}”之类的东西。

我知道在 C# 中有几种方法可以做到这一点,但不能拉下所有记录来对它们进行排序,因为那样会很慢。

有谁知道在 Sql server 中快速应用自然排序的方法?


我们正在使用:

然后我们按那个分页。

我们可以添加触发器,尽管我们不会。他们所有的输入都是参数化的等等,但我不能改变格式——如果他们输入“rec2”和“rec10”,他们希望它们会像那样以自然顺序返回。


我们有有效的用户输入,针对不同的客户遵循不同的格式。

一个人可能会去 rec1, rec2, rec3, ... rec100, rec101

而另一个可能会去:grp1rec1,grp1rec2,... grp20rec300,grp20rec301

当我说我们无法控制输入时,我的意思是我们不能强迫用户更改这些标准 - 它们具有像 grp1rec1 这样的值,我不能将其重新格式化为 grp01rec001,因为这会改变用于查找和链接到外部系统。

这些格式变化很大,但通常是字母和数字的混合。

在 C# 中对这些进行排序很容易 - 只需将其分解为{ "grp", 20, "rec", 301 }然后依次比较序列值。

但是可能有数百万条记录并且数据是分页的,我需要在 SQL 服务器上进行排序。

SQL 服务器按值排序,而不是比较 - 在​​ C# 中,我可以将值拆分出来进行比较,但在 SQL 中,我需要一些逻辑来(非常快速地)获得一致排序的单个值。

@moebius - 您的答案可能有效,但为所有这些文本值添加排序键确实是一种丑陋的妥协。

0 投票
14 回答
10015 浏览

algorithm - 自然排序算法

如何在不同的编程语言中自然地对字符串数组进行排序?在答案中发布您的实现及其使用的语言。

0 投票
22 回答
86859 浏览

sql - MySQL中的自然排序

有没有一种优雅的方法可以在 MySQL 数据库中进行高效、自然的排序?

例如,如果我有这个数据集:

  • 最终幻想
  • 最终幻想4
  • 最终幻想10
  • 最终幻想12
  • 最终幻想 12:Promathia 锁链
  • 最终幻想冒险
  • 最终幻想起源
  • 最终幻想战术

除了将游戏名称拆分为组件之外的任何其他优雅解决方案

  • 书名:《最终幻想》
  • 编号:“12”
  • 副标题:“Promathia 之链”

以确保它们以正确的顺序出现?(10 在 4 之后,而不是在 2 之前)。

这样做对a**来说是一种痛苦,因为时不时会有另一款游戏打破解析游戏标题的机制(例如“战锤40,000”、“詹姆斯邦德007”)

0 投票
18 回答
61055 浏览

c# - C#中的自然排序顺序

任何人都有很好的资源或在 C# 中为FileInfo数组提供自然顺序排序的示例?我正在IComparer以我的方式实现接口。

0 投票
4 回答
41630 浏览

perl - 如何自然地对哈希的键进行排序?

我有一个 Perl 哈希,其键以数字开头,或者是数字。

如果我使用,

该列表可能会出现,

代替

0 投票
1 回答
1531 浏览

c# - IComparer 问题 + 如何在 .NET 中自然地对字符串数组(FILE_10 > FILE_2)进行排序?

在我的帖子底部解决。

或者更具体地说:

我有一堆 FileInfo 对象(我需要 FileInfo 对象来排除隐藏、系统和重新分析点文件)。

我需要根据 FileInfo.FullName 自然地对 FileInfo[] 进行排序。所以 FILE_10.ext 应该在 FILE_2.ext 之后。幸运的是 FileInfo[] 只包含一个扩展名的文件。

我已经实现了一个比较器:

现在问题出现了,int.Parse 抛出了一个溢出异常,我无法在正确的位置捕获它(由于某种原因,它再次出现在 return 语句的行上,我无法在更上一层智能地处理它,因为它永远不会到达那里)。

问题是:这种事情是否有预先实现的比较器?异常出现在有趣的地方的原因可能是什么?

调用代码:

EDIT1: Int.Parse 在遇到太大的数字时抛出 OverflowException。它不应该经常发生,但我希望它被覆盖。

EDIT2:我最终调整了自己的比较器。离开了 int.Parse 并且只是用零填充以进行比较。代码在这里:

0 投票
5 回答
3879 浏览

sql - 如何按照用户的期望排序和显示字母和数字的混合列表?

我们的应用程序有一个CustomerNumber字段。我们有数百个不同的人在使用该系统(每个人都有自己的登录名和自己的列表CustomerNumber)。单个用户最多可能有 100,000 个客户。许多人少于100个。

有些人只在他们的客户编号字段中输入实际数字,而另一些人则混合使用。系统允许 20 个字符,可以是 AZ、0-9 或破折号,并将这些字符存储在 VARCHAR2(20) 中。任何小写字母在存储之前都会变成大写字母。

现在,假设我们有一个简单的报告,其中列出了特定用户的所有客户,按客户编号排序。例如

这是一个幼稚的解决方案,因为只使用数字的人不想看到简单的字母排序(“10”在“9”之前)。

我不希望就他们的数据向用户提出任何不必要的问题。

我正在使用 Oracle,但我认为看到其他数据库的一些解决方案会很有趣。请包括您的答案适用于哪个数据库。

您认为实现这一点的最佳方法是什么?

0 投票
2 回答
1215 浏览

mysql - 获取字符串的数字/规范化表示以帮助数据库中标题的“自然排序”

我想在表中存储一个附加列作为“排序值”,它是标题列的数字表示,这样这些值的顺序就代表了字符串的自然字母排序顺序。即,这样我就可以检索按排序值排序的行,它们将按自然排序顺序 - 当我插入新行时,我可以生成数值并知道相对于其他值的值将代表字符串的位置在字母搜索中,精确到前 X 个字母左右。

这有几个原因:首先,我想要一个比数据库服务器提供的简单排序更自然的排序,其中“The”和“A”之类的东西和标点符号在开始时会被忽略,而数字会被“自然”处理'。

其次,这适用于具有大量排列的索引 - 它会节省空间,并且可能会在遍历具有许多行的索引时节省时间。

我所追求的是将字符串转换为该数值的算法,或者我想只是一个规范化的字符串值。

我正在使用 PHP 和 MySQL。

恐怕“从数据库中提取所有内容并使用 natcasesort() 在 PHP 中排序”不是这种特殊情况的解决方案,因为我想在它们之前按排序顺序检索行(使用 order by 和 group by)得到一个连接或限制子句。谢谢。

编辑:

感谢您到目前为止的回答。我突然想到,我的应用程序使用 UTF-8 的事实非常相关。话虽如此,我认为以压缩/数字形式表示字符串的初始部分的实用性是一种延伸,可能只是某种规范化形式(所有大小写折叠,数字零填充,以及尽可能多的字符)归一化到它们的根,即 ã 到 a) 是合适的。

0 投票
9 回答
13700 浏览

c++ - 如何在 C++ 中实现自然排序算法?

我正在对由文本和数字组成的字符串进行排序。我希望排序将数字部分排序为数字,而不是字母数字。

例如我想要:abc1def, ..., abc9def, abc10def

而不是:abc10def,abc1def,...,abc9def

有谁知道这方面的算法(特别是在 C++ 中)

谢谢

0 投票
2 回答
221 浏览

mysql - 如何使用自然排序获取最大数据?

这是一个 varchar 列。但是“10.12.19”是我需要的最大数据。我怎么才能得到它?