我正在寻找一种最简单的方法来排序由数字和文本组成的数组,以及这些数组的组合.
例如
'123asd'
'19asd'
'12345asd'
'asd123'
'asd12'
Run Code Online (Sandbox Code Playgroud)
变成
'19asd'
'123asd'
'12345asd'
'asd12'
'asd123'
Run Code Online (Sandbox Code Playgroud)
这将与我在这里提出的另一个问题的解决方案结合使用.
排序函数本身就可以工作,我需要的是一个可以说'19asd'小于'123asd'的函数.
我是用JavaScript编写的.
编辑:正如adormitu指出的那样,我正在寻找的是一种自然分类的功能
任何人都拥有良好的资源或在C#中为FileInfo数组提供自然顺序排序的样本?我正在实现IComparer我的各种界面.
有没有一种优雅的方法在MySQL数据库中进行高性能的自然排序?
例如,如果我有这个数据集:
任何其他优雅的解决方案,而不是将游戏的名称分解为他们的组件
确保它们以正确的顺序出现?(4后4,而不是2).
这样做是一个痛苦的**,因为时不时有另一个游戏打破了解析游戏标题的机制(例如"Warhammer 40,000","James Bond 007")
我想要一些保留自然排序顺序1的字符串比较函数.Java中是否有这样的内容?我在String类中找不到任何内容,而Comparator类只知道两个实现.
我可以自己动手(这不是一个非常难的问题),但如果我不需要,我宁愿不重新发明轮子.
在我的具体情况下,我有我想要排序的软件版本字符串.所以我希望"1.2.10.5"被认为大于"1.2.9.1".
1通过"自然"排序顺序,我的意思是它将字符串与人类比较它们的方式进行比较,而不是"ascii-betical"排序顺序只对程序员有意义.换句话说,"image9.jpg"小于"image10.jpg","album1set2page9photo1.jpg"小于"album1set2page10photo5.jpg","1.2.9.1"小于"1.2.10.5"
我们有一个大型数据库,我们有数据库端分页.这很快,在几分之一秒内从数百万条记录中返回50行的页面.
用户可以定义自己的排序,基本上选择要排序的列.列是动态的 - 一些具有数值,一些日期和一些文本.
虽然大多数按预期文本排序是愚蠢的.嗯,我说愚蠢,它对计算机有意义,但让用户感到沮丧.
例如,按字符串记录ID排序会产生如下内容:
rec1
rec10
rec14
rec2
rec20
rec3
rec4
Run Code Online (Sandbox Code Playgroud)
...等等.
我希望这个考虑到这个数字,所以:
rec1
rec2
rec3
rec4
rec10
rec14
rec20
Run Code Online (Sandbox Code Playgroud)
我无法控制输入(否则我只是在前导000中格式化)而且我不能依赖单一格式 - 有些类似于"{alpha code} - {dept code} - {rec id}".
我知道在C#中有几种方法可以做到这一点,但是不能拉下所有记录来对它们进行排序,因为这样会慢.
有谁知道在Sql server中快速应用自然排序的方法?
我们正在使用:
ROW_NUMBER() over (order by {field name} asc)
Run Code Online (Sandbox Code Playgroud)
然后我们就这样分页.
我们可以添加触发器,但我们不会.他们所有的输入都是参数化的,但是我无法改变格式 - 如果他们输入"rec2"和"rec10",他们希望它们就像那样,以自然的顺序返回.
我们有有效的用户输入,遵循不同客户的不同格式.
有人可能会去rec1,rec2,rec3,... rec100,rec101
而另一个可能会去:grp1rec1,grp1rec2,... grp20rec300,grp20rec301
当我说我们无法控制输入时,我的意思是我们不能强迫用户更改这些标准 - 它们有一个像grp1rec1的值,我不能将其重新格式化为grp01rec001,因为这会改变用于查找的内容和链接到外部系统.
这些格式变化很大,但通常是字母和数字的混合.
在C#中对它们进行排序很容易 - 只需将其分解{ "grp", 20, "rec", 301 },然后依次比较序列值.
但是,可能有数百万条记录并且数据被分页,我需要在SQL服务器上进行排序.
SQL服务器按值排序,而不是比较 - 在C#中我可以将值拆分为比较,但在SQL中我需要一些逻辑(非常快)获得一致排序的单个值.
@moebius - 你的答案可能会有效,但是为所有这些文本值添加排序键确实感觉像是一个丑陋的妥协.
关注Sivaram Chintalapudi 提出的这个问题,我很感兴趣的是PostgreSQL中是否可以进行自然 - 或"人性化" - 对包含多位数字和单词/字母混合的字符串进行排序.没有固定的字符串中的单词和数字的模式,并且字符串中可能有多个多位数字.
我经常看到这个常见的地方是在Mac OS的Finder中,它自然地对包含混合数字和单词的文件名进行排序,在"3"之后放置"20",而不是在它之前.
所需的校对顺序将由算法产生,该算法将每个字符串拆分为字母数字边界的块,然后对每个部分进行排序,处理具有正常整理的字母块和用于整理目的的数字块作为整数.所以:
'AAA2fred'将成为('AAA',2,'fred')和'AAA10bob'将成为('AAA',10,'bob').然后可以根据需要对它们进行排序:
regress=# WITH dat AS ( VALUES ('AAA',2,'fred'), ('AAA',10,'bob') )
regress-# SELECT dat FROM dat ORDER BY dat;
dat
--------------
(AAA,2,fred)
(AAA,10,bob)
(2 rows)
Run Code Online (Sandbox Code Playgroud)
与通常的字符串排序规则相比:
regress=# WITH dat AS ( VALUES ('AAA2fred'), ('AAA10bob') )
regress-# SELECT dat FROM dat ORDER BY dat;
dat
------------
(AAA10bob)
(AAA2fred)
(2 rows)
Run Code Online (Sandbox Code Playgroud)
但是,记录比较方法没有概括,因为Pg不会比较ROW(..)构造或不等数量条目的记录.
给定此SQLFiddle中的示例数据,默认的en_AU.UTF …
如何对uniq -c输出进行自然排序?
当计数<10时,uniq -c | sort输出看起来很好:
alvas@ubi:~/testdir$ echo -e "aaa\nbbb\naa\ncd\nada\naaa\nbbb\naa\nccd\naa" > test.txt
alvas@ubi:~/testdir$ cat test.txt
aaa
bbb
aa
cd
ada
aaa
bbb
aa
ccd
aa
alvas@ubi:~/testdir$ cat test.txt | sort | uniq -c | sort
1 ada
1 ccd
1 cd
2 aaa
2 bbb
3 aa
Run Code Online (Sandbox Code Playgroud)
但是当计数大于10甚至数千/数时,这种排序会混乱,因为它是按字符串排序而不是按自然整数排序:
alvas@ubi:~/testdir$ echo -e "aaa\nbbb\naa\nnaa\nnaa\naa\nnaa\nnaa\nnaa\nnaa\nnaa\nnaa\nnaa\nnaa\nnnaa\ncd\nada\naaa\nbbb\naa\nccd\naa" > test.txt
alvas@ubi:~/testdir$ cat test.txt | sort | uniq -c | sort
10 naa
1 ada
1 ccd
1 cd
1 nnaa
2 aaa …Run Code Online (Sandbox Code Playgroud) 在数据库中,我有以下格式的各种字母数字字符串:
10_asdaasda
100_inkskabsjd
11_kancaascjas
45_aksndsialcn
22_dsdaskjca
100_skdnascbka
Run Code Online (Sandbox Code Playgroud)
我希望它们基本上按字符串前面的数字排序,然后按字符串名称本身排序,但当然,字符会逐个进行比较,因此Order by name的结果会产生:
10_asdaasda
100_inkskabsjd
100_skdnascbka
11_kancaascjas
22_dsdaskjca
45_aksndsialcn
Run Code Online (Sandbox Code Playgroud)
而不是我更喜欢的顺序:
10_asdaasda
11_kancaascjas
22_dsdaskjca
45_aksndsialcn
100_inkskabsjd
100_skdnascbka
Run Code Online (Sandbox Code Playgroud)
老实说,如果字符串只按前面的数字排序,我会没事的.我对PostgreSQL不太熟悉,所以我不确定最好的方法是什么.我很感激任何帮助!
我正在阅读目录内容使用QDir::entryList().其中的文件名结构如下:
index_randomNumber.png
Run Code Online (Sandbox Code Playgroud)
我需要按照indexWindows资源管理器对文件进行排序的方式排序,以便我得到
0_0815.png
1_4711.png
2_2063.png
...
Run Code Online (Sandbox Code Playgroud)
而不是排序通过QDir::Name给我:
0_0815.png
10000_6661.png
10001_7401.png
...
Run Code Online (Sandbox Code Playgroud)
在Qt中是否有内置的方法来实现这一点,如果没有,那么实现它的正确位置是什么?
natural-sort ×10
sorting ×8
sql ×3
algorithm ×2
postgresql ×2
c# ×1
c++ ×1
collation ×1
comparator ×1
count ×1
file ×1
java ×1
javascript ×1
mysql ×1
qt ×1
sql-order-by ×1
sql-server ×1
uniq ×1
unix ×1