将来プログラマーになりたい、専門学校生です。
キーボードから入力
a b c a d
結果
a 2
b 1
c 1
d 1
というようなプログラムを作っているのですが、出現回数のカウントと重複部分の削除のところがよく分かりません。無知な質問かもしれませんが、教えていただければ幸いです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
重複していたら削除と考えるよりも、文字列ごとに登場回数が何回であるかを集計した方が分かりやすいと思います。
Map
という辞書型のデータ構造を使って、文字列に対応する回数を集計します。
Map
に未登録なら初期値として1
を登録し、既に登録済みならそのカウントを1増やすようにします。
集計が終わったら、Map
の内容を出力します。
lang
1// Java5以降 2 3// import java.util.*; 4// import java.util.Map.Entry; 5 6String[] a = {"a", "b", "c", "a", "d"}; 7Map<String, Integer> m = new HashMap<String, Integer>(); 8// Java7以降なら new HashMap<>() でOK 9 10for (String s : a) { 11 int v; 12 if (m.containsKey(s)) { 13 // Mapに登録済み 14 v = m.get(s) + 1; 15 } else { 16 // Mapに未登録 17 v = 1; 18 } 19 m.put(s, v); 20} 21for (Entry<String, Integer> entry : m.entrySet()) { 22 System.out.printf("%s %d%n", entry.getKey(), entry.getValue()); 23}
ラムダを使った方法も考えられると思いますが、難しくなりそうなのでやめておきます。
投稿2014/12/31 03:40
総合スコア9390
0
プログラムの入門段階での知識で、質問文での入力に対して出力を得るだけなら、次のようなコードが考えられます。
lang
1// See https://teratail.com/questions/4874 2 3import java.io.BufferedReader; 4import java.io.IOException; 5import java.io.InputStreamReader; 6 7public class WordCount { 8 public static void main(String[] args) throws Exception { 9 // test 10 // do_test() 11 12 // ユーザからの入力を取得する 13 String str = read_line(); 14 // 入力値を集計する 15 int[] count_info = do_count(str); 16 // 結果をコンソールに出力 17 print_count_info(count_info); 18 } 19 20 private static String read_line() throws IOException { 21 System.out.println("キーワードを入力:"); 22 BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); 23 String line = input.readLine(); 24 return(line); 25 } 26 private static int[] do_count(String str) { 27 int[] ans = new int[128]; // 半角文字コード 28 for (String s: str.split("")) { 29 char ch = s.charAt(0); 30 if (ch != ' ') { 31 ans[ch]++; 32 } 33 } 34 return(ans); 35 } 36 private static void print_count_info(int[] count_info) { 37 char ch = 0; 38 for (int i: count_info) { 39 if (i > 0) { 40 System.out.format("%c %d\n", ch, i); 41 } 42 ch++; 43 } 44 } 45 // private do_test() { 46 // int[] count_info; 47 // print_count_info(do_count("a b c a d")); 48 // print_count_info(do_count("_ aa b c a d")); 49 // print_count_info(do_count("あ 12 \t \r")); 50 // print_count_info(do_count("a a1 a_1 \t \r")); 51 // } 52} 53 54// TODO: 55// カウントする単位 (文字、単語 ...) を決めて、それに従って実装すること。 56// 空白文字 (tab などの扱いを決めて、それに従って実装すること。 57// 日本語文字を扱えるようにすること。 58// Exception の扱いを決めて、それに従って実装すること。 59// STDIN からだけでなく、ファイルの読み込みを実装すること。 60// etc ...
実行例:
java WordCount キーワードを入力: a b c a d a 2 b 1 c 1 d 1 java WordCount キーワードを入力: aa
質問文では、"aa" の入力に対して "a 2" と出力するのか "aa 1" と出力するのかが判明しなかったのでここでは "a 2" と出力するようにしてあります。
日本語文字をあつかうようにしたり、aa 1 と出力するようにしようとすると、上のコードでつかっている固定長さの配列の方法では破綻します。
そのときに java の collection について調べること、それを実際につかって実装できるようになることが必要です。
回避する方法が 他の回答でいろいろと例が示されているわけです。
投稿2015/01/01 00:43
総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
お邪魔します。
いろんな方法があると思うので、こういう方法もありますよ、ぐらいの参考程度で。
Apache commons collectionsに、同じ要素の数を数えるためだけに存在するBugインターフェースというのがあります。
それを使ってやってみました。
(動きを見てもらうためにとりあえずで書いたので色々雑です。
全部mainに書くのもホントはご法度なんだけど;ごめんなさい。。。orz)
lang
1import java.io.BufferedReader; 2import java.io.IOException; 3import java.io.InputStreamReader; 4import java.util.Objects; 5 6import org.apache.commons.collections4.Bag; 7import org.apache.commons.collections4.bag.HashBag; 8import org.apache.commons.lang3.StringUtils; 9 10//キーボード入力されたアルファベットを数え上げるプログラム 11//動作には右記jarが必要 org.apache.commons.lang3, org.apache.commons.collections4 12//アルファベットといいつつ、スペース区切りで入力を判定しているので単語でも数えてしまうのはバグか?!w 13public class WordCount { 14 15 public static void main(String[] args) throws IOException { 16 17 //ユーザからの入力を取得する 18 System.out.println("キーワードを入力:"); 19 BufferedReader input = 20 new BufferedReader (new InputStreamReader(System.in)); 21 String s = input.readLine(); 22 23 //入力値を集計する 24 Bag<String> bag = new HashBag<String>(); 25 for(String each : StringUtils.split(s, " ")) { 26 bag.add(each); 27 } 28 29 // 結果をコンソールに出力 30 for (Object each : bag.uniqueSet()) { 31 System.out.println(StringUtils.join( 32 Arrays.asList(Objects.toString(each), 33 Objects.toString(bag.getCount(each))), " ")); 34 } 35 } 36 37}
基本的には他の回答者さんが提示されていたMapによる実装と大きく変わりません。
(自分で書くか、既にある実装に委ねるか、程度の違いだと思ってください)
というか、commonsが無かったら私もMapでやるでしょう。
以上、参考まで。
実行結果のサンプルを張り忘れていました。
lang
1キーワードを入力: 2a a b c a 3a 3 4b 1 5c 1
こんな感じになります
投稿2014/12/31 11:45
総合スコア540
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2014/12/31 13:23
2014/12/31 14:24
0
以下のページで質問の内容がそのままのっています。
How To Count Duplicated Items In Java List
たいていのことはすでに誰かが行っていて、情報を公開しています。
自分で考えることも重要ですが検索する能力も重要だと思います。
投稿2014/12/31 03:26
総合スコア3541
0
... 検索する能力...
この場合は "java count frequency" を 検索期間 1 年以内 で検索するとよさそうです。
その検索結果の中から 2 つを紹介します。
ここには、1つの問題をいろいろな言語で解いた例があります。
投稿2014/12/31 05:51
総合スコア22324
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2014/12/31 06:40