itljl 发表于 2010-4-22 02:25:39

请教一个排序问题。

本帖最后由 itljl 于 2010-4-22 02:27 编辑

$str = "a,b,a,a,b,c"

$strSP = StringSplit($str, ",")

For $I = 1 To $strSP
        MsgBox(0, 0, $strSP[$I])
Next


如何排序显示,
如第一个msgbox显示 a = 3,也就是a出现了3次,
然后是 b = 2 ,也就是b出现了2次。
然后是 c = 1, 也就是C出现了一次。

谢谢。
请注意,字符串中的a,b,c可以是任何字符.不一定是A,B,C

pusofalse 发表于 2010-4-22 02:55:09

如果字符串中只有半角字符,可以用正则匹配,循环匹配ASCII介于0x20-0x7E之间的字符,或者用Replace函数替换之后查看@extended的值。
如果含有全角字符,可以用表驱动法,用到的函数会有Assign、Eval,效率可能会有问题,因为是循环截取字符串中的每个字符。

netegg 发表于 2010-4-22 03:48:00

楼主是想按字符出现的次数排序吗?

3mile 发表于 2010-4-22 09:26:39

#include <array.au3>
$str = "a,b,a,a,b,c"

$strSP = StringSplit($str, ",")
_ArraySort($strSP, 0,1)
For $I = 1 To $strSP
      MsgBox(0, 0, $strSP[$I])
Next

shqf 发表于 2010-4-22 12:35:25

是这样吗:#include <array.au3>
$str = "a,d,b,a,d,a,b,d,c,d"
$strSP = StringSplit($str, ",")
_ArraySort($strSP, 0, 1)

Dim $var = "", $n = 0
For $I = 1 To $strSP
        If $var = "" Then $var = $strSP[$I]
        If $strSP[$I] = $var Then
                $n += 1
        Else
                MsgBox(0, "", $var & "=" & $n)
                $n = 1
        endif
    $var = $strSP[$I]
Next
MsgBox(0, 0, $var & "=" & $n)

itljl 发表于 2010-4-22 21:06:38

回复 5# shqf


    这位兄弟的接近了,不过有点小问题,就是D出现了4次,却排到最后去了,应该排在第一才对。

3mile 发表于 2010-4-22 22:43:48

#include <array.au3>
Dim $array
$str = "a,d,b,a,d,a,b,d,c,d,d,b,b,a,d,d,c,b,a,c,a,d,e"
$strSP = StringSplit($str, ",")
_ArraySort($strSP, 0, 1)
For $i=1 To $strSP
$str = StringReplace($str, $strSP[$i], "-")
$numreplacements = @extended
If $numreplacements>0 Then
_ArrayAdd($array,$numreplacements&"="&$strsp[$i])
EndIf
Next
_ArraySort($array, 1, 1)
For $n=1 To UBound($array)-1
        MsgBox(0,0,StringRegExpReplace($array[$n],"(\d{0,})=(.+)","$2=$1"))
Next
页: [1]
查看完整版本: 请教一个排序问题。