图片缩略图

可定制的自然顺序排序

version 2.1.2 (16.9 KB) by Stephen Cobeldick
字母数字类型的字符串单元格数组,具有可自定义的数字格式。
5.0
10评级

35下载

更新2020年11月27日

视图版本历史

查看许可协议

编者按:这个文件被选为MATLAB中心本周精选

使用NATSORTFILES对文件名或文件路径进行排序:
//www.tatmou.com/matlabcentral/fileexchange/47434-natural-order-filename-sort
使用NATSORTROWS对字符串单元格数组的行进行排序:
//www.tatmou.com/matlabcentral/fileexchange/47433-natural-order-row-sort

# # # # # #

字母数字类型的字符串单元格数组(1xN char)。对字符串进行排序,请考虑这些字符串中出现的任何数字子字符串的值。例如:比较

X = {'a2', 'a10', 'a1'};
排序(X)
Ans = 'a1' 'a10' 'a2'
的作用(X)
Ans = 'a1' 'a2' 'a10'

默认情况下,NATSORT将所有连续的数字解释为整数,可以使用正则表达式指定数字子串识别,允许数字子串具有:
* a +/-号
小数点和小数
* e表示法指数
*十进制,八进制,十六进制或二进制记数法
* Inf或NaN值
正则表达式支持的标准:金宝app查找、量词等。

当然,排序本身也是可以控制的:
*升序/降序排序方向
*字符大小写敏感/不敏感
数字与字符的相对顺序
数字与nan的相对顺序

# # # # # #例子

多个整数(例如发布版本号):
> > ={‘v10.6’,‘v9.10’,‘v9.5’,‘v10.10’,‘v9.10.20’,‘v9.10.8};
> >排序(A)
ans = ' v10.10 ' ' v10.6‘v9.10’‘v9.10.20’‘v9.10.8 v9.5的
> >的作用(一)
ans = ' v9.5 ' ' v9.10‘v9.10.8’‘v9.10.20’‘v10.6’‘v10.10’

整数、小数、NaN或Inf数,可能带有+/-符号:
> > B ={‘测试+南’,‘test11.5’,‘测试- 1.4’,‘测试’,‘test-Inf’,‘测试+ 0.3 '};
> >排序(B)
ans = 'test' 'test+0.3' 'test+NaN' 'test-1.4' 'test- inf ' 'test11.5' '
> >的作用(B”,[- +)? (NaN |正| \ d + \ ? \ d *)”)
ans = 'test' 'test- inf ' 'test-1.4' 'test+0.3' 'test11.5' 'test+NaN'

%%整数或十进制数,可能带指数:
>> C = {'0.56e007', '', '43E-2', '10000', '9.8'};
> >排序(C)
ans = " '0.56e007' '10000' '43E-2' '9.8' "
> >的作用(C, ' \ d + \ ? \ d * ((eE) [- +] ? \ d +)吗?”)
ans = " '43E-2' '9.8' '10000' '0.56e007'

%%十六进制数(带有'0X'前缀):
>> D = {'a0X7C4z', 'a0X5z', 'a0X18z', 'a0XFz'};
> >排序(D)
ans = 'a0X18z' 'a0X5z' 'a0X7C4z' 'a0XFz'
>> natsort(D, '0X[0-9A-F]+', '%i')
ans = 'a0X5z' 'a0XFz' 'a0X18z' 'a0X7C4z'

% %二进制数:
>> E = {'a11111000100z', 'a101z', 'a000000000011000z', 'a1111z'};
> >排序(E)
Ans = 'a000000000011000z' 'a101z' 'a11111000100z' 'a1111z' '
>> natsort(E, '[01]+', '%b')
Ans = 'a101z' 'a1111z' 'a000000000011000z' 'a11111000100z' '

% %例灵敏度:
F = {'a2', 'A20', 'A1', 'a10', 'a2', 'A1'};
>> natsort(F, [], 'ignorecase') %默认
ans = 'A1' 'A1' 'a2' 'a2' 'a10' 'A20'
>> natsort(F, [], 'matchcase')
ans = 'A1' 'A2' 'A20' 'A1' 'A2' 'a10'

% %排序顺序:
>> G = {'2', 'a', '3', 'B', '1'};
>> natsort(G, [], 'ascend') %默认
'1' '2' '3' 'a' 'B'
>> natsort(G,[], '下降')
ans = 'B' 'a' '3' '2' '1' "
>> natsort(G, [], 'num'1' '2' '3' 'a' 'B'
>> natsort(G, [], 'charans = " a " B " 1 " 2 " 3 "

%% UINT64个数(全精度):
>> natsort({'a18446744073709551615z', 'a18446744073709551614z'}, [], '%lu')
Ans = 'a18446744073709551614z' 'a18446744073709551615z'

引用作为

Stephen Cobeldick(2021)。可定制的自然顺序排序(//www.tatmou.com/matlabcentral/fileexchange/34464-customizable-natural-order-sort), MATLAB中央文件交换。检索

意见及评分(12)

伊曼纽尔Osikpa

这非常有帮助,谢谢。感觉超越自然

Jorge Viamontes

它工作,非常感谢你这样做,节省了我很多时间来编写它自己

谢谢,非常有用!它就像天然的Python。

张胸

维兰纽瓦López

省了我几天编程的时间。一分钟内搞定。

晓惠顾

非常有用!

Stephen Cobeldick

@Akim Borbuev: NATSORT函数将解析所有的输入单元格数组,所以如果你只想按第一列排序,那么你可以使用索引只选择那一列,例如给定一个nx2单元格数组C:

[~, idx] =作用(C (: 1));
D = C (idx:);

然后使用NATSORT的第二个输出对单元格数组的行进行排序。你想这样做吗?

Akim Borbuev

你好,

我有一个nx2单元格,我想应用你的自然顺序排序到第一列,但各自的值在第二列。是可能的吗?
谢谢你!

问候,
Akim

简·范·登·布洛克

俊杰王

qiap陈

很好工具

张胸