[リストへもどる]
一括表示

投稿時間:2002/12/12(Thu) 18:59
投稿者名:hide
Eメール:
URL :
タイトル:
特定の文字の数
どうも。お世話様です。
ある文字列において,特定の文字数をカウントしたいのですけど
EX 「abbcccdddd」 cは3つ。のような感じです。
単純にループをして一文字づつ比較検索すれば数えられますが,
文字数が多くなったりすると、あまり得策じゃないんで・・・
何か良い方法ありますか?

投稿時間:2002/12/12(Thu) 19:11
投稿者名:よねKEN
Eメール:
URL :http://www5b.biglobe.ne.jp/~yone-ken/
タイトル:
Re: 特定の文字の数
> ある文字列において,特定の文字数をカウントしたいのですけど
> EX 「abbcccdddd」 cは3つ。のような感じです。
> 単純にループをして一文字づつ比較検索すれば数えられますが,
> 文字数が多くなったりすると、あまり得策じゃないんで・・・

そういう方法しかありません。
どう得策じゃないんでしょうか?
数が多くなっても、For文でやればコードは代わりませんが。

> 何か良い方法ありますか?

元の文字数とReplace関数を使って特定の文字"c"を削除した文字列の文字数との差を
取れば文字数をカウントすることもできます。
ただし、内部的には無駄な処理が含まれるので、速度面ではマイナスかもしれません。
また、コードのわかりやすさもシンプルと言えるかどうかはわかりません。

他にもSplit関数を使っていくつに分割されたか?を調べる手もあります。

投稿時間:2002/12/12(Thu) 19:22
投稿者名:hide
Eメール:
URL :
タイトル:
Re^2: 特定の文字の数
> そういう方法しかありません。
> どう得策じゃないんでしょうか?
> 数が多くなっても、For文でやればコードは代わりませんが。

たぶん,ループが増えることで処理に時間が掛かるのが嫌なんで
自己解決いたしました。
InStr関数を使用して,特定の文字を検索して見つかった位置の数より
検索してき,文字列が見つからなくなったら検索終了させれば
処理に時間が掛からないでしょうね。

投稿時間:2002/12/12(Thu) 21:26
投稿者名:Lantern
Eメール:
URL :
タイトル:
Re^3: 特定の文字の数
試してみました
'test1:1文字づつ比較
'test2:文字検索
     test1   test2
1回目: 0.1605  0.0064375
2回目: 0.1595625 0.0133125
3回目: 0.16175  0.0076875
4回目: 0.173375  0.0015
5回目: 0.1605  0.0064375
test1については2通り試してみました(コメントと非コメント)
が同じくらいでした

Private Sub Command1_Click()

    Dim i As Integer
    Dim l As Long
    Dim lLen As Long
    Dim bCnt As Integer
    Dim lPos As Long
    Dim strTestString As String
    Dim sCmp As String
    Dim sTm As Single
    
    strTestString$ = vbNullString
    For i% = 0 To 9999
        strTestString$ = strTestString$ & "abcdefghijklmnopqrstuvwxyz"
    Next i%
    
    'test1
    sTm! = Timer!
'    lLen& = Len(strTestString$)
    bCnt% = 0
    l& = 0&
    Do
        sCmp$ = Mid$(strTestString$, l& + 1&, 1&)
        If sCmp$ = vbNullString Then
            Exit Do
        End If
        If StrComp(sCmp$, "c", vbBinaryCompare) = 0 Then
            bCnt% = bCnt% + 1
        End If
        l& = l& + 1&
    Loop While True
'    For l& = 1& To lLen& - 1&
'        If StrComp(Mid$(strTestString$, l&, 1), "c", vbBinaryCompare) = 0 Then
'            bCnt% = bCnt% + 1
'        End If
'    Next l&
    Me.Label1.Caption = Timer! - sTm!
'    MsgBox ("COUNT" & CStr(bCnt%))
    
    'test2
    sTm! = Timer!
    lPos& = 0&
    bCnt% = 0
    Do
        lPos& = InStr(lPos& + 1&, strTestString$, "c", vbBinaryCompare)
        If lPos& > 0& Then
            bCnt% = bCnt% + 1
        End If
    Loop Until lPos& <= 0&
    Me.Label2.Caption = Timer! - sTm!
    'MsgBox ("COUNT" & CStr(bCnt%))
End Sub

投稿時間:2002/12/13(Fri) 13:33
投稿者名:hide
Eメール:
URL :
タイトル:
Re^4: 特定の文字の数
おぉ〜
Lantern 様どうもありがとうです。^^
参考になりました。