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

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

ただいまの
回答率

91.01%

  • Java

    12156questions

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

英単語の複数形への変換について[JAVA]

解決済

回答 2

投稿

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

b_b_b

score 8

前提・実現したいこと

単語の複数形への変換は、次のルールに従い行われます。

・末尾が s, sh, ch, o, x のいずれかである英単語の末尾に es を付ける
・末尾が f, fe のいずれかである英単語の末尾の f, fe を除き、末尾に ves を付ける
・末尾の1文字が y で、末尾から2文字目が a, i, u, e, o のいずれでもない英単語の末尾の y を除き、末尾に ies を付ける
・上のいずれの条件にも当てはまらない英単語の末尾には s を付ける

入力された英単語を複数形に変換するプログラムを作成してください。

入力は以下のフォーマットで与えられます。

N #入力される単語の数
a_1 #1個目の単語
a_2 #2個目の単語
...
a_N #N個目の単語

必ずしも実在の英単語が入力されるわけではありません。
入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。

以上のような設問に対して、以下のコードを提出しましたが、 条件式の中身のボリュームが多く、よりよいコードがあればご教示いただければ幸いです。

該当のソースコード

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        sc.nextLine();
        for (int i = 0; i < N; i++) {
            String word = sc.nextLine();
            int size = word.length();
            int cut_length = 2;
            String end2 = word.substring(size - cut_length);
            String end1 = end2.substring(1);

            if (end1.equals("s") || end1.equals("o") || end1.equals("x") || end2.equals("sh") || end2.equals("ch")) {
                word += "es";
            }else if (end1.equals("f")) {
                word = word.replaceFirst(end1, "ves");
            }else if (end2.equals("fe")) {
                word = word.replaceFirst(end2, "ves");
            }else if (end1.equals("y") && ( !end2.substring(0, 1).equals("a") || !end2.substring(0, 1).equals("i") || !end2.substring(0, 1).equals("u") || !end2.substring(0, 1).equals("e") || !end2.substring(0, 1).equals("o"))) {
                word = word.replaceFirst(end1, "ies");
            }else {
                word += "s";
            }
            System.out.println(word);
        }

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • 退会済みユーザー

    2017/10/12 10:06

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 2

checkベストアンサー

+2

  • 対象の文字列を配列またはList化して処理を統一します。
  • 指定された文字列で終わるかどうかを判定するendsWithというメソッドがあります。
  • 処理をわかりやすくするために、メソッドに切り出します。
  • replaceFirstの場合、万が一文字列の途中に該当文字列があった場合、文末ではなくそこが置換されてしまうため、文末を置き換えるように改造
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        sc.nextLine();
        for (int i = 0; i < N; i++) {
            String word = sc.nextLine();
            System.out.println(multiple(word));
        }

    }

    public static String multiple(String word) {
        for (String s : new String[]{"s", "o", "x", "sh", "ch"}){
            if (word.endsWith(s)) {
                return word + "es";
            }
        }
        for (String s : new String[]{"f", "fe"}) {
            if (word.endsWith(s)) {
                return word.substring(0, word.length() - s.length()) + "ves";
            }
        }
        if (word.endsWith("y") {
            String end2 = word.substring(word.length() - 2, word.length() - 1);
            if (!"aiueo".contains(ends2)) {
                return word.substring(0, word.length() - 1) + "ies";
            }
        }
        return word + "s";
    }
}

multipleメソッドをStreamを使って書くとこうなりますか。
他にも別表現してます。

    public static String multiple(String word) {
        if (Stream.of("s", "o", "x", "sh", "ch").anyMatch(word::endsWith)) {
            return word + "es";
        }
        if (Stream.of("f", "fe").anyMatch(word::endsWith)) {
            return word.substring(0, word.lastIndexOf('f')) + "ves";
        }
        if (word.endsWith("y") {
            char end2 = word.charAt(word.length() - 2);
            if ("aiueo".indexOf(end2) < 0) {
                return word.substring(0, word.length() - 1) + "ies";
            }
        }
        return word + "s";
    }

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/10/12 17:12

    正規表現使うともっとスマートに書けそう。

    キャンセル

0

参考条件:
http://www.java2s.com/Tutorial/Java/0040__Data-Type/Transformswordstosingularpluralhumanizedhumanreadableunderscorecamelcaseorordinalform.htm
には、正規表現をつかった 単語の複数形をえるメソッド(java) の例があります。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

  • 受付中

    [java][日付チェック]質問

    java初心者です。 テキストファイルを一行づつ読み込んで行く時に、 32日や14月など、異常な日付が紛れていた場合例外として処理する方法はありますでしょうか? while ((

  • 受付中

    Javaの質問です。テキストファイルのデータを上書き(部分的に削除)したいです。お力をお貸しください...

    初めて利用させていただきます。 現在私は、テキストファイルを用いるJavaの勉強をしております。 テキストファイルに、コンソールで入力した「name」「job」「sex」を

  • 受付中

    java 標準クラス

    java勉強中ですがうまく動作しません。 ------dokojavaで動作しましたが、3回づつ表示されます。 public class Main { public st

  • 受付中

    JAVAに詳しい方、ご教授下さい。

    前提・実現したいこと こんばんは。Java初心者で勉強中のものです。 わからないので質問させていただきます。 標準入力から入力された文字列をコンマ「,」で区切りファイルに

  • 解決済

    [Java]計算プログラムが正常に動作しない

    import java.util.*; public class Main { public static void main(String[] args) {

  • 解決済

    Java Hit&Blow

    Hit&Blowのコードです。 答えの4桁の数字が重複しないためのコードはどのように書けばいいのでしょうか? import java.util.Scanner; class

  • 解決済

    java replaceでcharが文字化けする

    前提・実現したいこと int型の数値をchar型にキャストし、それを二番目の引数にしてreplaceをした文字列が文字化けしてしまう問題が発生しました。 該当のソースコード

  • 受付中

    Java 初心者です

    import java.util.Scanner; class car{ private int speed; public void speedUp(){ if(speed 

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

  • Java

    12156questions

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