前提・実現したいこと
C#のHashtableに入っているデータ(単語)をカウントして一番多く出現した単語をアウトプットすることに挑戦してるところですが、たとえば、apple ,apple, bananaがHashtableに入ってるならappleをアウトプットする。
一番多い単語が一個しかない場合は実現できたものの、もしこれがapple,apple,banana,bananaとなったとき最後のbananaしかアウトプットできません。
appleとbanana両方アウトプットする方法はありますか??
該当のソースコード
C#
1static void Main(string[] args) 2 { 3 //テキストファイルの中の単語をリストに 4 string filePath = ("file path"); 5 6 List<string> lines = File.ReadAllLines(filePath).ToList(); 7 8 Hashtable ht = new Hashtable(); 9 10 int count = 1; 11 //time complexity O(n) 12 //because this loop should loop through every single line 13 foreach (string line in lines) 14 { 15 if (ht.ContainsKey(line)) 16 { 17 ht[line] = (int)ht[line] + 1; 18 19 } 20 else 21 { 22 ht.Add(line, count); 23 } 24 25 } 26 27 //print hashtable 28 //time complexity O(n) 29 //because this loop should loop through every single line 30 foreach (DictionaryEntry entry in ht) 31 { 32 Console.WriteLine("Key: " + entry.Key + " / " + "Value: " + entry.Value); 33 } 34 35 maxFreq(ht); 36 Console.ReadKey(); 37 } 38 public static void maxFreq(Hashtable ht) 39 { 40 string key = ""; 41 int max = 0; 42 43 //loop throught the hashtable 44 //time complexity O(n) 45 //because this loop should loop through every single line 46 foreach (DictionaryEntry entry in ht) 47 { 48 if ((int)entry.Value > max) 49 { 50 max = (int)entry.Value; 51 key = (string)entry.Key; 52 } 53 } 54 55 Console.WriteLine("The maximum frequency word is: " + key);
if の中にif (ht.ContainsKey(max)){Console.WriteLine("The maximum frequency word is: " + key);}を試してもうまく行きませんでした。
めちゃくちゃ初心者な質問で申し訳無いですが、なにかアドバイスいただけたら嬉しいです。
よろしくおねがいします。
課題にしては Hashtable の使い方がよくありませんが、これは何ですか?
課題だとしたら参考にしているサイトがよくないと思います。
そうでないとしたら Hashtable ではなく List<string> を使えば混乱が少なくなるのではないでしょうか。
var list = new List<string> { "apple", "banana", "banana" };
var word = list.GroupBy(a => a).OrderByDescending(a => a.Count()).First().Key; // グループ化して多い順に並べ替えて一番多い単語を word に入れる
Console.WriteLine(word);
maxFreq(Hashtable ht) メソッドの引数に渡す Hashtable をどのように生成しているかのサンプルを書いてください。
> apple,apple,banana,bananaとなったとき
質問者さん自身が問題を誤解して質問文がおかしくなっている可能性がありますが、キーが果物の名前で、値が果物の個数 なのかもしれませんね。
var hash = new Hashtable() { { "apple", 2 }, { "banana", 2 } };
いずれにせよコメントをいただいているようにHashtableをどのように生成しているか、ちゃんと具体的に示しましょう。>質問者さん
Zuishinさん
ご回答ありがとうございます。
海外のサイトで勉強していて、Hashtableの中にテキストファイルの内容を入れるタスクでしたが、自分で色々ためしてたらこういう質問がでてきました。
SurferOnWwwさん dodox86さん
ご回答ありがとうございます。
コード更新しました。
わかりづらくてすみませんでした。
ダメな場合の List<string> lines の例も書いてもらえませんか? どれがどうなって欲しいのかも。
SurferOnWwwさん
apple,apple,banana,banana4つの単語が入っているテキストファイルをHashtableに入れて
Key: apple Value: 2
Key: banana Value: 2
をアウトプットするということに挑戦してまして、これについては問題なく実現できました。今やろうとしていることは、このHashtableに入っている単語で一番出現回数が多い単語をアウトプットするというタスクです。自分のコードでは一番出現回数が多い単語が一つの場合なら問題なく反映されるんですが、apple,apple,banana,bananaのようにapple2回banana2回の場合bananaしか反映されないんです。
もしできるならappleとbanana両方アウトプットしたいですが、そこで躓いています。わかりづらい質問すみませんでした。
> apple,apple,banana,banana4つの単語が入っているテキストファイルをHashtableに入れて
そのテキストファイルから読んできて変数 lines に代入するのは以下のコードと同じになると想像してます。
List<string> lines = new List<string> { "apple", "apple", "banana", "banana" };
であれば、Hashtable など使わなくても、Linq を使って lines を直接操作すれば望む結果が得られると思うのですが?
わざわざ Hashtable を使っているのは勉強のため? そうだとしても今は Hashtable は非推奨で、代わりに Dictionary<TKey, TValue> を使うよう推奨されてます。
> 海外のサイトで勉強していて
とのことですが、かなり古い記事では? であれば、もっと新しい記事で勉強した方が良いのではないですか?
SurferOnWwwさん
返信ありがとうございます。
今はHashtableの基本的な文法や使い方について勉強しているところでして、ご指摘していただいた部分を参考に別のサイトを探してみます。
わざわざありがとうございました。
回答3件
あなたの回答
tips
プレビュー