質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

5回答

35886閲覧

重複した文字列をカウントして、重複した文字列を削除する方法がわかりません

itr1214

総合スコア17

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

4クリップ

投稿2014/12/31 03:09

将来プログラマーになりたい、専門学校生です。

キーボードから入力
a b c a d

結果
a 2
b 1
c 1
d 1

というようなプログラムを作っているのですが、出現回数のカウントと重複部分の削除のところがよく分かりません。無知な質問かもしれませんが、教えていただければ幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

argius

総合スコア9390

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

itr1214

2014/12/31 06:40

回答ありがとうございます。僕には無い考え方で、詳しく説明していただきありがとうございます。とても勉強になりました。
guest

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

katoy

総合スコア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

ShinpeiYamamoto

総合スコア540

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ShinpeiYamamoto

2014/12/31 12:26

質問者さんはプログラミング初心者さんだと書いてあったので少し。 なんだか、回答欄を読んでいると検索能力が必須スキルのようになっている気がするので、私なりの考えを述べてみます。 仕事で新人を教育するような立場にここ数年おかれていてよく思うのは、検索して他人のコードを組み合わせてプログラムを組む人が本当に多いなということです。実際のところ私はそれが本当は残念で。 本当の技術というのは、無から自分の持っているものを組み合わせて物を作るところにその醍醐味があると思うのですけどね。 本当に優秀なやつというのは、ネットの無い環境でもjavaのAPIリファレンスだけ渡しとけば試行錯誤してちゃんと動くものを出してくるものです。 もちろん、調べたり上級者に教えてもらったりすることで、自分では決して発想できなかった効率的なやり方や綺麗な書き方を知ることができる、ということは事実で、大いに調べるべきだし、質問すべきなのですが。 調べたときに、これを使えばできるというところで終わらずに、そのコードがどうして動作しているのか、そのアルゴリズムと使われているデータ構造を理解して自分のものにしていく、ということと、調べる前に自分の頭で考えて、自分の知りうることだけで動作するものを何とか組み上げようと試行錯誤する、ということが、地味だけれど上達への一番の近道なのではないかと思います。
itr1214

2014/12/31 13:23

回答ありがとうございます。 新人を教育するような方にアドバイスしていただけるなんて本当にうれしいです。 まだまだ、出来ないことだらけですが、いろいろ試行錯誤を繰り返して出来ることを増やしていきたいとおもいます!!
ShinpeiYamamoto

2014/12/31 14:24

私はそれほど大した技術者ではないのですよ。ただ少し年を取ったというだけです。 きっとitr1214さんには私よりもっと高いところへいける可能性があるとおもいます。 正しい努力をして、正しい知識を学んで、大物になってくださいね。 頑張ってください!!
guest

0

以下のページで質問の内容がそのままのっています。
How To Count Duplicated Items In Java List

たいていのことはすでに誰かが行っていて、情報を公開しています。
自分で考えることも重要ですが検索する能力も重要だと思います。

投稿2014/12/31 03:26

sho_cs

総合スコア3541

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

itr1214

2014/12/31 04:14

回答ありがとうございます。貴重なアドバイスをありがとうございます。とても参考になるURLを張ってくださってありがとうございます。
guest

0

... 検索する能力...

この場合は "java count frequency" を 検索期間 1 年以内 で検索するとよさそうです。
その検索結果の中から 2 つを紹介します。

ここには、1つの問題をいろいろな言語で解いた例があります。

投稿2014/12/31 05:51

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

itr1214

2014/12/31 06:42

回答ありがとうございます。まだプログラミング初心者で、おっしゃるとおり、検索する能力が欠如しているんだと思います。こういう風に検索すればいいとアドバイスをしていただき本当にありがとうございます。今後、検索するときの参考にさせてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問