带数值的字符串数组排序讨论
本帖最后由 tryhi 于 2012-8-20 22:56 编辑字符串排序,但将字符串里面的数字当成数值,而不是字符串来操作,看下面截图排序前跟排序后你就清楚。
隐藏部分是我的算法,因为我发现我写的似乎较啰嗦,请大家自己发散思考个算法与大家分享,参与者加30至80分,不过可能要分几天来加分,但一定少不了,发出来请加入隐藏,不要影响到后来的思维。
另外算法中有什么BUG或者不对的请大家指点批评。
该算法是这样的,我朋友他需要对一批数据进行排列,这批数据前面是产品型号,后面是规格,需要将同样型号排在一起,且尺寸从小到大排裂,比如产品“ABC 10”、“ABC5”、“ABC20”、“ABC2.5”,需要排成这样“ABC2.5”“ABC5”“ABC10”“ABC20”,但在EXCEL中它会排成这样“ABC10”“ABC2.5”“ABC20”“ABC5”,所以才写出此算法
**** Hidden Message ***** #include <array.au3>
$timer = TimerInit()
Dim $array = ["a", "bc", "sb12312", "123sb", "31sb", "4sb", "0.15sb"]
Dim $newarray
Dim $prenumber, $item
For $i = 0 To UBound($array) - 1
$item = $array[$i]
$prenumber = StringRegExp($item,"^-?[\d]+(\.\d+)?",2)
Dim $tmpArr
If Not @error Then
$newarray[$i] = $prenumber
Else
$newarray[$i] = $item
EndIf
$newarray[$i] = $item
Next
_ArraySort($newarray)
For $i = 0 To UBound($newarray) - 1
$array[$i] = $newarray[$i]
Next
_ArrayDisplay($array, TimerDiff($timer)) ; #include <array.au3>
$timer = TimerInit()
Dim $array = ['czr1.5', _
'czr1.6abc', _
'opear1000ab', _
'cxd5.9', _
'opear5.6', _
'64.1auto123', _
'4cxd0.25df5', _
'cadll8.613', _
'czr48as26', _
'opear5855as85', _
'45cxd0.25f', _
'auto984', _
'opear354df', _
'czr48', _
'opear5855', _
'45cxd0.25', _
'auto984', _
'opear354', _
'541auto1.3', _
'cadll861', _
'auto984dfa']
Dim $newarray
Dim $prenumber, $item
For $i = 0 To UBound($array) - 1
$item = $array[$i]
$prenumber = StringRegExp($item,"^-?[\d]+(\.\d+)?",2)
If Not @error Then
$newarray[$i] = Number($prenumber)
Else
$newarray[$i] = $item
EndIf
$newarray[$i] = $item
Next
_ArraySort($newarray)
For $i = 0 To UBound($newarray) - 1
$array[$i] = $newarray[$i]
Next
_ArrayDisplay($array, TimerDiff($timer)) ; 围观高淫,菜鸟表示鸭梨山大... 我想问如果字符串中同时出现2个单词该怎么排
如以上数字中有个123auto123cxd5.9,该排在哪?
它是该排在cxd中,还是auto中 看看,学习一下 好好学习 天天向上 本帖最后由 tryhi 于 2012-8-20 22:11 编辑
drunk 发表于 2012-8-20 18:58 http://www.autoitx.com/images/common/back.gif
drunk 发表于 2012-8-20 19:05 http://www.autoitx.com/images/common/back.gif
2楼3楼的排序失败,没有按照要求,看结果似乎跟_ArraySort函数没有区别,现在加不了分,等一会可以加分了定补回
我想问如果字符串中同时出现2个单词该怎么排
我想问如果字符串中同时出现2个单词该怎么排
如以上数字中有个123auto123cxd5.9,该排在哪?
它是该排在cxd中,还是auto中
duck904 发表于 2012-8-20 19:29 http://www.autoitx.com/images/common/back.gif
5楼可能没有理解是什么意思,排序肯定是对多个进行排,你说一个,没办法排 本帖最后由 netegg 于 2012-8-20 22:21 编辑
不对呀,你这个排序方式不对呀,文字的时候从左到右,数字的时候又改成从右到左了,没这么排序的 本帖最后由 tryhi 于 2012-8-20 22:23 编辑
转成ascii,按数字排序定索引,出原字符
netegg 发表于 2012-8-20 22:19 http://www.autoitx.com/images/common/back.gif
请蛋哥指点,多个数字出的ascii字符如何定大小
------------------------------------------------------
蛋哥修改回复修改得那么快,蛋哥可能没理解题意,请刷新一下看图,我做了个说明 回复 11# tryhi
简单问一下
如你例图中18,19项
如果是opera59, opera581应该怎么排 本帖最后由 tryhi 于 2012-8-20 22:35 编辑
回复tryhi
简单问一下
如你例图中18,19项
如果是opera59, opera581应该怎么排
netegg 发表于 2012-8-20 22:29 http://www.autoitx.com/images/common/back.gif
581明显比59大,肯定是opera59排在前面啦,如果是普通排法581排在前面,此贴还有什么意义?所以说字符串中存在的“数值”而不是数字 本帖最后由 netegg 于 2012-8-20 22:43 编辑
回复 13# tryhi
按你这个排序
opera59 < opera581, 大概意思,是不是从右向左排?
那么opera59和operb58呢? 本帖最后由 tryhi 于 2012-8-20 22:54 编辑
回复tryhi
按你这个排序
opera59 < opera581, 大概意思,是不是从右向左排?
那么opera59和operb58呢 ...
netegg 发表于 2012-8-20 22:38 http://www.autoitx.com/images/common/back.gif
opera581、opera59、operb58应该这样子排,先排左边的字符串,再对比右边数字
opera59
opera581
operb58