找回密码
 加入
搜索
查看: 2264|回复: 14

[效率算法] 排列数组 为什么99会大于100[已解决]

  [复制链接]
发表于 2017-4-22 19:48:27 | 显示全部楼层 |阅读模式
本帖最后由 dingcool 于 2017-4-22 22:58 编辑

#include <Array.au3>
_arraysort($fscjall,1)
结果会这样

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
 楼主| 发表于 2017-4-22 19:48:51 | 显示全部楼层
真头痛~~~~~~~
发表于 2017-4-22 21:57:11 | 显示全部楼层
回复 2# dingcool


    文字排列法    99 大於 100
 楼主| 发表于 2017-4-22 22:05:56 | 显示全部楼层
回复 3# kk_lee69


    如何改成数字排列呢~~~~~~~
 楼主| 发表于 2017-4-22 22:07:34 | 显示全部楼层
自己想了个临时解决方法,效率慢,凑合用吧
Func arraysort($fscjall)

        If _ArrayMax($fscjall) < 90 Then
                _ArraySort($fscjall)
                Return $fscjall
        EndIf
        
        For $i = 0 To UBound($fscjall) - 1
                For $j = 0 To UBound($fscjall) - 1 - 1 - $i

                        
                        
                        $a = StringSplit($fscjall[$j][0], ".")
                        $b = StringSplit($fscjall[$j + 1][0], ".")
                        

                        
                        If StringLen($a[1]) < StringLen($b[1]) Then
                                
                                
                                ;ConsoleWrite($fscjall[$j][0] & ">" & $fscjall[$j + 1][0] & @CRLF)
                                $temp0 = $fscjall[$j][0];
                                $temp1 = $fscjall[$j][1];
                                
                                $fscjall[$j][0] = $fscjall[$j + 1][0]
                                $fscjall[$j][1] = $fscjall[$j + 1][1]
                                
                                $fscjall[$j + 1][0] = $temp0
                                $fscjall[$j + 1][1] = $temp1
                                ContinueLoop
                                
                        EndIf
                        
                        
                        If StringLen($a[1]) < StringLen($b[1]) Then
                                ContinueLoop
                        EndIf
                        
                        
                        
                        If StringLen($a[1]) == StringLen($b[1]) Then
                                
                                If $fscjall[$j][0] < $fscjall[$j + 1][0] Then
                                        ;        ConsoleWrite($fscjall[$j][0] & "= >  " & $fscjall[$j + 1][0] & @CRLF)
                                        $temp0 = $fscjall[$j][0];
                                        $temp1 = $fscjall[$j][1];
                                        
                                        $fscjall[$j][0] = $fscjall[$j + 1][0]
                                        $fscjall[$j][1] = $fscjall[$j + 1][1]
                                        
                                        $fscjall[$j + 1][0] = $temp0
                                        $fscjall[$j + 1][1] = $temp1
                                Else
                                        ContinueLoop
                                EndIf
                                
                                
                        EndIf
                        
                        
                Next
        Next
        Return $fscjall
EndFunc   ;==>arraysort
发表于 2017-4-22 22:14:12 | 显示全部楼层
本帖最后由 kk_lee69 于 2017-4-22 22:21 编辑

回复 5# dingcool
有 善用 搜索嗎??

http://www.autoitx.com/forum.php ... light=%5C_arraysort

http://www.autoitx.com/forum.php ... highlight=arraysort

评分

参与人数 1金钱 +30 收起 理由
dingcool + 30 再次感谢

查看全部评分

发表于 2017-4-22 22:19:28 | 显示全部楼层
回复 5# dingcool

某 前輩的一段話~~~
先将文件名中的数字统一在其左边补0到一指定的最大位数,(比如5位:1-10.txt 补0后 00001-00010.txt)
再用 _ArraySort() 排序

评分

参与人数 1金钱 +30 收起 理由
dingcool + 30 thx

查看全部评分

 楼主| 发表于 2017-4-22 22:55:10 | 显示全部楼层
Func _LeftArraysort($fscjall)

        If _ArrayMax($fscjall) > 90 Then
                
                For $j = 0 To UBound($fscjall) - 1
                        
                        $a = StringSplit($fscjall[$j][0], ".")
                        If StringLen($a[1]) == 2 And StringLen($a[1]) < 3 Then $fscjall[$j][0] = "0" & $fscjall[$j][0]
                        
                Next
                
        EndIf

可以是可以了 总是感觉前面多个0难看,看来排完序  还要去判断第一个是否为0 删除掉


        _ArraySort($fscjall, 1)
        Return $fscjall

EndFunc 
 楼主| 发表于 2017-4-22 22:59:31 | 显示全部楼层
另外  将数据强制转换成数字再排序  autoit有这方面的函数吗

double() float()
发表于 2017-4-22 23:57:34 | 显示全部楼层
你的 數組 資料怎麼來的??
发表于 2017-4-23 00:02:54 | 显示全部楼层
回复 9# dingcool

剛剛給你的範例裡面  蛋大

不是說了  試一下 以下的範例

#include <Array.au3>
Local $test [12] = [30.7,5.5,41.5,25.7,14.5,73.2,86.8,87.1,89.5,23.2,91,69.2]
_arraysort($test,0)
_ArrayDisplay($test)


所以結論應該是  你的 數組 來源是甚麼
如果從來源下手.....進入數組的時候 是 數字 不就解決問題了嗎??

评分

参与人数 1金钱 +20 收起 理由
dingcool + 20 基本解决

查看全部评分

发表于 2017-4-23 06:11:54 | 显示全部楼层
你的数组里的数值是文本吧(字符串)
 楼主| 发表于 2017-4-23 18:31:29 | 显示全部楼层
回复 11# kk_lee69

感谢,主要这些数据是服务器返回的 都是文本 对本文进行整理 获得的数字再比较

其本质还是字符串  所以比大小出现上述问题 我的数据量不大
1 判读字符串长度
2或者刚才说的左侧填充0
    都可以解决,感谢 !
发表于 2017-4-23 19:05:25 | 显示全部楼层
回复 13# dingcool

試試看  將數組

FOR   NEXT

然後用 Number 轉換一次 重新回填

或者 將 數組內容直接 +0 後 回填

在做排序動作
发表于 2017-4-24 10:30:15 | 显示全部楼层
学习了。排序原来有这么多注意点
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-4-25 18:58 , Processed in 0.093093 second(s), 30 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表