出現回数を数えるには?

解決


サスクワッチ  URL  2002-10-30 04:26:01  No: 105295

またまた質問です。

ある文章の中に、特定の文字列が複数ある場合に、その出現回数を
数えたいのですが、どうすればよいでしょうか?

例えば、
「プログラミングライブラリー」という文字列の「ラ」を
指定すると「3」と表示させるようにしたいのです。


たかみちえ  URL  2002-10-30 04:59:01  No: 105296

InStrをつかって、見つからなくなるまで繰り返すのはどうでしょうか?


Say  2002-10-30 07:39:41  No: 105297

あるいは "ラ" を "" にReplaceして、Lenの差をとるとか…。


Say  2002-10-30 07:44:04  No: 105298

あるいは"ラ"をデリミタとしてSplitしてUboundするとか…。


イトウ  2002-11-01 00:59:00  No: 105299

'Text1から特定の文字を見つける
sub FindStrings(fd as String)
dim st as string
dim fl as long
dim cn as long

dim i  as long

if fd="" then exit sub

st=Text1.Text
fl=len(fd)
cn=0
for i=1 to len(st)-fl
  if mid$(st,i,fl)=fd then cn=cn+1
next
end sub

これで多分できます。
ちょ〜原始的なので、アルゴリズムを変えるといいとおもいます。


サスクワッチ  2002-11-01 05:56:56  No: 105300

すみませんが、ボタンをクリックするとTextBox2に数を表示させる
プログラムの参考を教えていただけないでしょうか?
ちなみにVB5です。


YuO  2002-11-01 07:54:15  No: 105301

新しい質問には新しいスレッドを用意してください。

でもって,
> プログラムの参考
とは何でしょうか?

プログラム書くなら,
Sub Button_Click
    TextBox2.Caption = "1"
End Sub
で済みますが……。


サスクワッチ  2002-11-02 04:46:33  No: 105302

その様な意味ではなく、イトウさんのプログラムのことについてです。
新しい質問ではありません。
説明が足りなかったようです。すみません。
最初に書いたように、
「プログラミングライブラリー」という文字列の「ラ」を
指定すると「3」とテキストボックスに表示させるプログラムを
作っていただけないでしょうか?
お願いします。


たかみちえ  URL  2002-11-02 05:29:18  No: 105303

結果を格納した変数を表示するということですか?
  多分、あなたならもうご存知だと思うんですけど…。

  TextBox2.Caption = n ;nには結果

  VBは変数の型変換を自動でやってくれるので、
これだけでいいです。


サスクワッチ  2002-11-02 08:41:56  No: 105304

すみません。初心者なもんでイトウさんのソースを呼んでも理解が出来ずです。
結果の変数はどれでしょうか?


たかみちえ  URL  2002-11-02 17:26:05  No: 105305

"初心者なんで"という言葉は、この掲示板では禁句です。

  さておき、変数というものや、戻り値のものの概念は、理解していますか?
よくわからないのなら、
まずそういうサイトや本を見るなりして、理解したほうがいいと思います。


YuO  2002-11-03 01:55:32  No: 105306

イトウさんのコードは最後の一文字が検索対象から外れますね……。
文字列"あ"に対して検索文字列"あ"を入れると,みつからない,という結果になります。
また,文字列"あああい"に対して検索文字列"ああ"を入れると,
イトウさんのコード:2
Sayさんの方法:1
です。

Vb5だとReplaceもSplitも使えないですが,私ならSayさんの結果になるように組みますね……。

>「プログラミングライブラリー」という文字列の「ラ」を
>指定すると「3」とテキストボックスに表示させるプログラムを
>作っていただけないでしょうか?

こういう問題は分割して考えるものです。
・特定の文字列に対して検索文字列を与えて検索文字列の出現回数を得る方法
・数字をテキストボックスに表示する方法
#なので「新しい質問」と書いた。前者と後者に直接の繋がりはないので。

後者は既にたかみちえさんが書かれています。で,前者は関数にしてしまえばいいです。
イトウさんのを少し改良でも良いのですが,動作に嫌な点があるので,こんな感じのを使いますね。

' C/C++ likeに書くための関数 (無限ループを嫌った)
Private Function AssignAndReturn (ByRef AssignVariable As Long, ByVal AssignValue As Long) As Long
    AssignVariable = AssignValue
    AssignAndReturn = AssignValue
End Function

' 文字列の出現回数計測関数
Function CountString (BaseString As String, FindString As String) As Long
    Dim start As Long, pos As Long, Counter As Long, FindLength As Long

    ' 検索文字列長をキャッシュ
    FindLength = Len(FindString)
    ' InStrに与える初期検索開始位置
    start = 1

    ' 実際に検索 (コメントアウトした三行はAssignAndReturnを展開したもの)
'   Do While True
'       pos = InStr(start, BaseString, FindString)
'       If pos = 0 Then Exit Do
    Do Until AssignAndReturn(pos, InStr(start, BaseString, FindString)) = 0
        ' 見つかった
        Counter = Counter + 1
        ' 検索開始位置をずらす
        ' これをstart = pos + 1とするとイトウさんのコードの動作と同じになる
        start = pos + FindLength
    Loop

    CountString = Counter
End Function

Do Untilのところが珍しいかもしれませんが,それ以外は特別なことはやっていません。
#根本がC++屋なので。
多分,Visual BASIC Version 1.0あたりから動くはずです。
#Visual BASIC 4.0以前と4.0 16bit版はUnicodeじゃないから日本語を含むと誤動作の可能性はあり。
#Quick BASICとかMicrosoft BASICでも動くかな?

文字列の検索なんて言うのは,基本的に言語に依存しませんから,
「動く」コードの提示を受けても,「なぜ動くか」は絶対に調べるべきです。
上記だと,LenとInstrという組み込み関数を使っています。
これらがどのような動作を行うのか調べ,さらにデバッガを使って実際に値を入れたときの動作も調べることです。

>初心者なもんでイトウさんのソースを呼んでも理解が出来ずです。
>結果の変数はどれでしょうか?

初心者だからって,全部がわからないわけではないと思うのですが……。
全て訊くのではなく,「ここがわからない」といった風に訊ねるのが鉄則です。
Mid$の動作さえわかれば単純なことをやっているソースですから。

で,候補はひとつしか無いと思うんですけどね……。
とりあえず,
・Text1.Textが"プログラミングライブラリー"
・fdが"ラ"
だとして,机上デバッグしてみればよいでしょう。
どれがカウンタ(CouNter)か,すぐわかりますよ。


サスクワッチ  2002-11-03 05:27:11  No: 105307

皆さんあちがとうございました。
>"初心者なんで"という言葉は、この掲示板では禁句です。
わかりました。すみません。
>変数というものや、戻り値のものの概念は、理解していますか?
一応JavaScriptやPerlなら出来ますので、そこまでプログラミングに
慣れていないわけではありません。

>こういう問題は分割して考えるものです。
それは個人の価値観の問題だと自分は思います。
自分は分割する必要性は無いと思いました。
>全部がわからないわけではないと思うのですが……。
イトウさん解からないことだらけだったので、ちょっと混乱していました。
すみません。
YuOさんのソースは結構理解できました。わざわざありがとうございます。
AssignAndReturnの部分がちょっと解からなかったのでこれから
調べます。


YuO  2002-11-03 06:34:56  No: 105308

>AssignAndReturnの部分がちょっと解からなかったのでこれから
>調べます。

これはC/C++/Javaなら
while ((pos = InStr(start, BaseString, FindString)) != 0) {
と書くところを,そのまま書くために作った物です。
>    Do Until AssignAndReturn(pos, InStr(start, BaseString, FindString)) = 0
この行を消して,前三行にあるコメント文に差し替えればAssignAndReturnは不要になります。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加