- ベストアンサー
配列のセットの仕方
- VBで英文の単語を抽出して頻度順に並べるプログラムを作成したい
- VBのソースコードとQuickSortのソースコードを結合する方法がわからない
- アドバイスをお願いします
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
サンプルを作ってみました。 '--------------------------------------------------------------- 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つの種類でなく、キー(ワード)と、値(件数)の対応がとれている配列を渡すようにすればいいかもしれません。 そのまま、内部でソートしています。
その他の回答 (1)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
もうひとつわからないのですが、 Text1には、 This is a pen. That is an apple. とかなんとか入ってるということですか? それで、is:2回とかしたいということですか? 同じ頻度のwordが有った場合、(ThisとThatが有った場合、Thatが前に来るとか)順序は考慮するのでしょうか? また、THIS とThisは別ですか、同じですか? Text2と、Text3は、何に使うのでしょうか? Text2は、.とか?とか,とか改行とかそういう物を取り除いたText1と考えて良いのでしょうか? 結局、出力はどこにどういう形式でするんでしょう?
お礼
返信ありがとうございます。 >This is a pen. That is an apple. とかなんとか入ってるということですか? それで、is:2回とかしたいということですか? そういうことです。最終的にはi等のbe動詞をカットする機能も付けたいと思っております。 >また、THIS とThisは別ですか、同じですか? 同じにしたいと思っております。 >Text2は、.とか?とか,とか改行とかそういう物を取り除いたText1と考えて良いのでしょうか? text2,text3は、途中経過を見るために作っております。最終的には無くしてしまおうと思ってます。 それで結構です。最終的な出力はテキストボックス(Text4)にする予定です。
お礼
ありがとうございます。 家に帰ったらさっそく読んでみます。