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

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

ただいまの
回答率

87.60%

単語の小文字変換処理

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 787

score 13

### テキストファイルを読み、単語数を出力する。単語はすべて小文字に変換処理する。

カウント数が多い単語順に出力することはできましたが、小文字変換することができません。
toLowerCaseで変換しようと試したのですがうまくいきません。

ここに言語を入力
public class TextCounter {

static String FILE = "c:\\p001-input.txt";
static String SEPARATOR = "(\\s+?|\\.|,|;)";

public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
try (FileReader f = new FileReader(FILE);
BufferedReader br = new BufferedReader(f)) {
String line;
while ((line = br.readLine()) != null) {
String[] words = line.split(SEPARATOR);
for (String word : words) {
if (!word.isEmpty()) {
if (map.containsKey(word)) {
int count = map.get(word) + 1;
map.put(word, count);
} else {
map.put(word, 1);
}
}
}
}

} catch (FileNotFoundException e) {
System.out.println("ファイルが見つかりません");
} catch (IOException e) {
System.out.println("読み込み失敗");
}
List<String> list = new ArrayList<>();
int max = 0;
for (String key : map.keySet()) {
list.add(key);

if (max < key.length()) {
max = key.length();
}
}
Collections.sort(list, (o1, o2) -> {
return - map.get(o1) + map.get(o2);
});
String format = "%-" + max + "s: %3d";
for (String word : list) {
int count = map.get(word);
if (10 <= count) {
System.out.printf(format, word, count);
System.out.println();
}
}
}
}

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • swordone

    2019/04/12 13:25

    「うまくいかない」では通じません。なにがどう「うまくいかない」のか、たとえば「ここでこういうコンパイルエラーが出る」とか、「こうなって欲しいのに実際はこうなる」とか、具体的な事象を説明してください。

    キャンセル

  • m.ts10806

    2019/04/12 13:30

    コードはマークダウンのcode機能を利用してご提示ください。

    キャンセル

  • swordone

    2019/04/12 15:08

    私とmts10806さんの依頼をどちらも満たしていません。

    キャンセル

  • jimbe

    2019/04/12 18:39 編集

    「実現したいこと」の前にある「```」を消して、コードの一番最後の「}」の下に「```」を入れてください.
    「ここに言語を入力」の文字列を「java」に書き換えてください.
    これらの操作で, コードが薄灰色の枠内に(左上に java という文字列を伴って)表示されるようになります.

    キャンセル

回答 2

checkベストアンサー

0

for (String word : words) {
    if (!word.isEmpty()) {
        word = word.toLowerCase();      // ここ
        if (map.containsKey(word)) {
            int count = map.get(word) + 1;
            map.put(word, count);
        } else {

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/15 17:27

    回答ありがとうございます。
    上手くいきました。

    キャンセル

0

解決したようなので、自分流の回答を

public class TextCounter {

    static String FILE = "c:\\p001-input.txt";
    // 正規表現変更 こうすればこれらの文字が連続で出てきても空文字は発生しない
    static String SEPARATOR = "[\\s\\.,;]+";

    public static void main(String[] args) {
        try (FileReader f = new FileReader(FILE);
                 BufferedReader br = new BufferedReader(f)) {

             Map<String, Long> map = 
                 br.lines().flatMap(s -> Arrays.stream(s.split(SEPARATOR)))
                           .collect(Collectors.groupingBy(String::toLowerCase,
                                                          Collectors.counting()));
             int maxLength = map.keySet().stream().mapToInt(String::length).max();
             String format = "%-" + maxLength + "s: %3d";
             map.entrySet().stream().filter(e -> e.getValue() >= 10)
                           .sorted(Comparator.comparing(e -> e.getValue(),
                                                        Comparator.reverseOrder()))
                           .map(e -> String.format(format, e.getKey(), e.getValue()))
                           .forEachOrdered(System.out::println);

        } catch (FileNotFoundException e) {
            System.out.println("ファイルが見つかりません");
        } catch (IOException e) {
            System.out.println("読み込み失敗");
        }
    }
}

ただし、10回以上出現する単語だけ出力しているようなので、最長単語の出現回数が9回以下の場合に隙間が空く気がする

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/16 09:23

    ありがとうございます。
    ちなみに、単語区切りを英数字以外にする正規表現はどのように書けばよいでしょうか?

    キャンセル

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

  • ただいまの回答率 87.60%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る