tryhi 发表于 2012-8-20 17:51:48

带数值的字符串数组排序讨论

本帖最后由 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 *****

drunk 发表于 2012-8-20 18:58:14

#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)) ;

drunk 发表于 2012-8-20 19:05:00

#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)) ;

邪恶海盗 发表于 2012-8-20 19:22:01

围观高淫,菜鸟表示鸭梨山大...

duck904 发表于 2012-8-20 19:29:58

我想问如果字符串中同时出现2个单词该怎么排
如以上数字中有个123auto123cxd5.9,该排在哪?
它是该排在cxd中,还是auto中

lpxx 发表于 2012-8-20 19:55:10

看看,学习一下

oceanwind 发表于 2012-8-20 20:30:09

好好学习 天天向上

tryhi 发表于 2012-8-20 22:10:08

本帖最后由 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函数没有区别,现在加不了分,等一会可以加分了定补回


tryhi 发表于 2012-8-20 22:13:20

我想问如果字符串中同时出现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:19:04

本帖最后由 netegg 于 2012-8-20 22:21 编辑

不对呀,你这个排序方式不对呀,文字的时候从左到右,数字的时候又改成从右到左了,没这么排序的

tryhi 发表于 2012-8-20 22:21:35

本帖最后由 tryhi 于 2012-8-20 22:23 编辑

转成ascii,按数字排序定索引,出原字符
netegg 发表于 2012-8-20 22:19 http://www.autoitx.com/images/common/back.gif

请蛋哥指点,多个数字出的ascii字符如何定大小



------------------------------------------------------


蛋哥修改回复修改得那么快,蛋哥可能没理解题意,请刷新一下看图,我做了个说明

netegg 发表于 2012-8-20 22:29:16

回复 11# tryhi

简单问一下
如你例图中18,19项
如果是opera59, opera581应该怎么排

tryhi 发表于 2012-8-20 22:34:44

本帖最后由 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:38:00

本帖最后由 netegg 于 2012-8-20 22:43 编辑

回复 13# tryhi
按你这个排序
opera59 < opera581, 大概意思,是不是从右向左排?
那么opera59和operb58呢?

tryhi 发表于 2012-8-20 22:50:45

本帖最后由 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
页: [1] 2 3
查看完整版本: 带数值的字符串数组排序讨论