こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

配列のセットの仕方

度々質問してすいません。

英文の単語を抽出して頻度順に並べるプログラムをVBで作りたいと思っております。下記URLのVB版です。
http://gamp.c.u-tokyo.ac.jp/archive/perl.htm
以下が作成したソースです。これとQuickSortのソース(http://www.geocities.co.jp/SilkRoad/4511/vb/sort.htm
を繋げて終わりたいと思うのですが、
どうつなげたらいいのかわかりません。
アドバイスをお願いいたします。

Private Sub Command1_Click()

Dim strTarget As String
Dim strResult As String
Dim cha As String
Dim chaList() As String
Dim word As String
Dim wordList() As Long
Dim i As Long, j As Long
Dim EndFlg As String



strTarget = Me.Text1.Text

i = 0
EndFlg = ""
Do Until EndFlg = "END"
i = i + 1
cha = Mid(strTarget, i, 1)
If cha <> "" Then
ReDim Preserve chaList(i)
chaList(i - 1) = cha
Else
EndFlg = "END"
End If
Loop

For i = 0 To UBound(chaList) - 1
If chaList(i) = "." Then
chaList(i) = " "
End If
Next

Text2 = ""
For i = 0 To UBound(chaList) - 1
Text2 = Text2 & chaList(i)
Next

Text3 = ""
word = ""
For i = 0 To UBound(chaList) - 1
If chaList(i) = " " Then
If i = 0 Then
Else
If chaList(i - 1) = " " Then
Else
Text3 = Text3 & Chr(13) & Chr(10) & word
word = ""
End If
End If
Else
word = word & chaList(i)
End If
Next
If word <> "" Then
Text3 = Text3 & Chr(13) & Chr(10) & word
End If

投稿日時 - 2005-11-17 22:11:46

QNo.1785522

困ってます

質問者が選んだベストアンサー

サンプルを作ってみました。
'---------------------------------------------------------------
Dim strTarget As String
Dim strResult As String
Dim text As String
Dim strArray, dic, keyArray, str, x

Dim n, wk, i As Integer, j As Integer, k As Integer 'ソートで使う変数

strTarget = Me.Text1.Text
text = Trim(strTarget) '前後のスペース削除
text = LCase(text) '小文字に統一
text = Replace(text, ",", "") '除外文字の削除
text = Replace(text, ".", "")
text = Replace(text, "?", "")
'text = Replace(text, "the","") '除外文字列(ワード)の削除
strArray = Split(text, " ") 'スペースで分割して配列に格納
Set dic = CreateObject("Scripting.Dictionary") 'ディクショナリオブジェクトを使ってカウント
For Each str In strArray
If str <> "" Then '中身が無いときスキップ
If dic.Exists(str) Then '既に登録されている時+1
dic.Item(str) = dic.Item(str) + 1
Else
dic.Add str, 1 '新しく辞書登録
End If
End If
Next
keyArray = dic.keys '登録したキーを配列で取り出す
'シェルソート
n = UBound(keyArray)
k = n \ 2
Do While (k > 0)
For i = 0 To n - k
j = i
Do While (j >= 0)
'個数が大きい時、または同じ個数の時、文字の辞書順で交換
If (dic.Item(keyArray(j)) < dic.Item(keyArray(j + k))) Or _
(dic.Item(keyArray(j)) = dic.Item(keyArray(j + k))) And (keyArray(j) > keyArray(j + k)) Then
wk = keyArray(j)
keyArray(j) = keyArray(j + k)
keyArray(j + k) = wk
j = j - k
Else
Exit Do
End If
Loop
Next
k = k \ 2
Loop
'結果の出力
strResult = ""
For i = 0 To dic.Count - 1
strResult = strResult & keyArray(i) & ":" & dic.Item(keyArray(i)) & vbCrLf
Next
Text4.text = strResult
End Sub
'---------------------------------------------------------------
ソート部分のソートの方法はなんでもいいです、
要は、比較対象を比較して、その時交換すべき物を交換することができればいいのです。
質問文の参考URLでは、種別ごとのソートになっていますが、バリアントを使うと種類を考えないでソートできます。
この場合、1つの種類でなく、キー(ワード)と、値(件数)の対応がとれている配列を渡すようにすればいいかもしれません。
そのまま、内部でソートしています。

投稿日時 - 2005-11-18 15:42:32

お礼

ありがとうございます。
家に帰ったらさっそく読んでみます。

投稿日時 - 2005-11-18 16:03:19

このQ&Aは役に立ちましたか?

4人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

もうひとつわからないのですが、
Text1には、
This is a pen. That is an apple.
とかなんとか入ってるということですか?
それで、is:2回とかしたいということですか?
同じ頻度のwordが有った場合、(ThisとThatが有った場合、Thatが前に来るとか)順序は考慮するのでしょうか?
また、THIS とThisは別ですか、同じですか?
Text2と、Text3は、何に使うのでしょうか?
Text2は、.とか?とか,とか改行とかそういう物を取り除いたText1と考えて良いのでしょうか?
結局、出力はどこにどういう形式でするんでしょう?

投稿日時 - 2005-11-18 03:47:09

お礼

返信ありがとうございます。

>This is a pen. That is an apple.
とかなんとか入ってるということですか?
それで、is:2回とかしたいということですか?

そういうことです。最終的にはi等のbe動詞をカットする機能も付けたいと思っております。

>また、THIS とThisは別ですか、同じですか?
同じにしたいと思っております。

>Text2は、.とか?とか,とか改行とかそういう物を取り除いたText1と考えて良いのでしょうか?
text2,text3は、途中経過を見るために作っております。最終的には無くしてしまおうと思ってます。
それで結構です。最終的な出力はテキストボックス(Text4)にする予定です。

投稿日時 - 2005-11-18 13:23:19