前提・実現したいこと
プログラム初心者でJavaを学習しています。
2回目の投稿です。
Javaでデータファイルを読み込んで、出現する単語ごとに数をカウントする機能を作成しています。
単語の条件は以下です。
-
- "I"以外は全て小文字で扱う("My"と"my"は同じく"my"として扱う)
-
- 単数形と複数形のように少しでも文字列が異れば別単語として扱う("dream"と"dreams"は別単語)
-
-
- アポストロフィーやハイフン付の単語は1単語として扱う("isn't"や"dead-end")
-
おおまかにはできましたが実行中に大文字のアポストロフィーが小文字のアポストロフィーになっておらず、重複を確認しました。
その部分を修正したいのですが、丸1日調べてもわからずアドバイスをいただきたいです。
発生している問題・エラーメッセージ(一部)
in = 3 increasing = 1 is = 14 isn't = 1 isn’t = 1 it = 6 its = 1
該当のソースコード
Java
1import java.io.*; 2import java.util.*; 3public class Q{ 4 5 private static final String SEPARATOR = "(\s+?|\.|,|;)"; 6 7 private static InputStream openDataFile() { 8 //getResourceAsStreamメソッドを利用すると、リソースファイル(設定ファイルなどのこと)を簡単に読み込むことができるらしい 9 return Q0033.class.getResourceAsStream("data.txt"); 10 } 11 12 public static void main(String[] args){ 13 // 集計 14 //カウントには以下のMap<String, Integer>を使用 15 Map<String, Integer> map = new HashMap<>(); 16 try ( 17 18 FileReader fr = new FileReader(Q0033.class.getResource("data.txt").getFile()); 19 20 21 BufferedReader br = new BufferedReader(fr)){ 22 23 24 25 //splitメソッドで分割した単語をword[]配列に格納していく。 26 String[] words = line.split(SEPARATOR); 27 28 29 //繰り返し処理 30 for (String word : words) { 31 //もしwordが空でないなら… 文字列が空かどうかを判定する – isEmptyメソッド 32 //分解後に空白1文字が残る場合に備え、単語の出現数のカウントではisEmpty()メソッドを使用 33 34 String nKey = ""; 35 36 if (!word.isEmpty()) { 37 /* 38 containsKeyメソッドは、指定したキーが存在するか確認を行い、キーが存在する場合は「true」を返します 39 Map.containsKey(検索するキー) 40 キー→単語 41 値 →出現数 42 単語wordが与えられたときの処理は以下の考え方。 43 単語がMapのキーに含まれている場合、出現数を加算する。 44 単語がMapのキーに含まれていない場合、以下をMapに格納する。 45 キー word 46 値 1 47 */ 48 49 50 if (word.equals("I")) { 51 nKey = word; 52 } else { 53 nKey = word.toLowerCase(Locale.getDefault()); 54 } 55 56 if (map.containsKey(nKey)) { 57 /* 58 要素を取り出すためにgetメソッドを使用する。 get(Object key) 59 要素を格納するためにputメソッドを使用する。 put(K key, V value) 60 */ 61 int count = map.get(nKey) + 1; 62 map.put(nKey, count); 63 //空じゃなくて初登場なら1をwordに付与する 64 } else { 65 map.put(nKey, 1); 66 } 67 68 69 } 70 } 71 } 72 } catch (FileNotFoundException e) { 73 System.out.println("ファイルが見つかりませんでした。"); 74 } catch (IOException e) { 75 System.out.println("読み取りに失敗しました。"); 76 } 77 /* 78 アルファベット辞書順に並び変えて出力 79 条件 80 * - "I"以外は全て小文字で扱う("My"と"my"は同じく"my"として扱う) 81 * - 単数形と複数形のように少しでも文字列が異れば別単語として扱う("dream"と"dreams"は別単語) 82 * - アポストロフィーやハイフン付の単語は1単語として扱う("isn't"や"dead-end") 83 */ 84 85 List<String> list = new ArrayList<>(); 86 //formatを最大文字数に合わせて揃えたい 87 int maxLengthOfSpelling = 0; 88 89 for (String key : map.keySet()) { 90 list.add(key); 91 //順番にみていって、maxLengthOfSpellingを更新していく 92 if (maxLengthOfSpelling < key.length()) { 93 maxLengthOfSpelling = key.length(); 94 } 95 } 96 97 /* 98 アルファベット順にソート 99 "I"以外は全て小文字で扱う("My"と"my"は同じく"my"として扱う) 100 Comparatorインターフェースを用いた方法ではソートするための条件をプログラマが決めることができる。 101 複雑な条件でのソートやオブジェクトの並び替えを特定のルールに沿って行いたいときは、この方法を用いる 102 */ 103 Collections.sort(list, new Comparator<String>() { 104 @Override 105 public int compare(String s1, String s2) { 106 return s1.compareToIgnoreCase(s2); 107 } 108 }); 109 110 // 全部の値を出力 111 String format = "%-" + maxLengthOfSpelling + "s= %3d"; 112 113 114 for (String word : list) { 115 int count = map.get(word); 116 //出力の回数を制限するなら、ここで if (出現させたい件数 <= count)で可能 117 118 System.out.printf(format, word, count); 119 System.out.println(); 120 } 121 } 122}
該当のテキストファイル
I walk slowly, but I never walk backward.
There is more to life than increasing its speed.
Without haste, but without rest.
There is always light behind the clouds.
If you can dream it, you can do it.
All your dreams can come true if you have the courage to pursue them.
Kites rise highest against the wind – not with it.
Growth is often a painful process.
Our greatest glory is not in never failing, but in rising up every time we fail.
Failure is a detour, not a dead-end street.
Although the world is full of suffering, it is full of the overcoming of it.
My life didn’t please me, so I created my life.
Life isn’t about finding yourself. Life is about creating yourself.
Do one thing everyday that scares you.
The future starts today, not tomorrow.
Conquer yourself rather than the world.
Life is like riding a bicycle. To keep your balance you must keep moving.
Happiness depends upon ourselves.
Fear always springs from ignorance.
The most important thing in communication is hearing what isn't said.
Experience is not what happens to you. It is what you do with what happens to you.
Peace begins with a smile.
Love is doing small things with great love.
My true religion is kindness.
Darkness cannot drive out darkness; only light can do that. Hate cannot drive out hate; only love can do that.
試したこと
ロケールを指定しようとなどしました。
Java
1nKey = word.toLowerCase(Locale.ENGLISH);
補足情報(FW/ツールのバージョンなど)
intelliJ IDEA 2020.3.1を使用しています。
回答3件
あなたの回答
tips
プレビュー