🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

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

Q&A

解決済

3回答

2491閲覧

toLowerCaseメソッドで大文字の補助記号を小文字に変換したいです。

KuKuKurusu

総合スコア1

Java

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

0グッド

0クリップ

投稿2021/01/07 07:48

前提・実現したいこと

プログラム初心者で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を使用しています。

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

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

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

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

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

maisumakun

2021/01/07 07:51

「大文字のアポストロフィ」「小文字のアポストロフィ」とはそれぞれ何のことでしょうか?
KuKuKurusu

2021/01/08 01:41

失礼いたしました。 大文字と小文字ではなくて、全角’と半角'になります。
guest

回答3

0

「アポストロフィー 大文字」でググったら、一番上に出てきました。
この記事を参考に、アポストロフィーを統一してから処理すればOKだと思います。
アポストロフィの形は2種類? その経緯とサイト制作時の考え方

投稿2021/01/07 08:23

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

'は、大文字小文字の関係ではありません

投稿2021/01/07 07:53

maisumakun

総合スコア145967

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

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

maisumakun

2021/01/07 07:53

端的に言えば、両者が混ざっている「元データがよくない」ということになります。
guest

0

「java 全角 半角 変換」でググったら、一番上に出てきました。
Javaにおける文字列の全角⇔半角変換について

投稿2021/01/08 02:29

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問