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

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

ただいまの
回答率

88.77%

しりとりアプリでのメソッドの実装

受付中

回答 2

投稿 編集

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

hinanogi

score 18

前提・実現したいこと

しりとりをおこなうアプリをつくっています.その際のプレイヤークラスに関するメソッドgetHandです.

keyCharに対応するリストをdictionaryから取得,先頭の要素を返す.先頭の要素はリストから消しておく.リストが空になれば,keyCharと対応するリストをdictionaryから削除しておく.
戻り値はkeyCharに対応する語彙がなくなった場合はnullを返す.

発生している問題・エラーメッセージ

メソッドの戻り値が正しくない.
メインメソッドの「ご」をキーとするデータが存在している.

該当のソースコード

java

ソースコード
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public abstract class Player {
    private Map<String, List<String>> dictionary;
    protected String keyChars;
    private String name;
    private String[] words;

    public Player(String name, String[] words) {
        this.name = name;
        this.words = words;
    }

    public abstract void update(String message);

    **public String getHand() {
        for (String str : words) {
            if (dictionary.containsKey(keyChars)) {
                dictionary.get(keyChars).get(0);
                if(keyChars.isEmpty()){
                    dictionary.remove(str);
                }
            }
            break;
        }

        return null;
    }**

    protected void makeDictionary(int length) {
        dictionary = new HashMap<>();
        for (String str : words) {
            String key = str.substring(0, length);
            if (!dictionary.containsKey(key)) {
                dictionary.put(key, new ArrayList<String>());
            }
            dictionary.get(key).add(str);
        }

    }

    public String getName() {
        return name;
    }
}

メインメソッド

java

public static void メソッドgetHand実装and動作検査() {
        MethodCheck m = new MethodCheck("getHand", String.class, new Class<?>[]{}, Modifier.PUBLIC, false);
        printResult(m.isExisit(target2), m.getName()+"が存在する?");
        printResult(m.isCorrectAccessor(target2), m.getName()+"の修飾子が正しい?");
        printResult(m.isCorrectReturnType(target2), m.getName()+"の戻り値の型が正しい?");
        printResult(!m.isAbstract(target2), m.getName()+"をabstractにしていない?");

        Constructor<TestClass2> con = (Constructor<TestClass2>) ConstructorCheck.getConstructor(target, new Class<?>[]{String.class, String[].class});
        if (con != null) {
            try {
                String[] sTest = {"ごりら", "らいおん", "らくだ", "らーめん"};
                TestClass2 e = con.newInstance("hi", sTest);
                Method m2 = e.getClass().getSuperclass().getDeclaredMethod("getHand", new Class<?>[]{});
                Method m4 = e.getClass().getSuperclass().getDeclaredMethod("makeDictionary", new Class<?>[]{int.class});
                if (m2 != null) {
                    m4.setAccessible(true);
                    m4.invoke(e, new Object[]{1});
                    FieldCheck.setSuperClassPrivateField(e, "keyChars", "ご");
                    String ret = (String) m2.invoke(e, new Object[]{});
                    Map<String, List<String>> map = (Map<String, List<String>>)FieldCheck.getSuperClassPrivateField(e, "dictionary");

                    printResult("ごりら".equals(ret),"メソッドgetHandの戻り値は「ごりら」");
                    printResult(!map.containsKey("ご"), "「ご」をキーとするデータが存在しない?");

                    ret = (String) m2.invoke(e, new Object[]{});
                    printResult(ret==null,"メソッドgetHandの戻り値はnull?");

                    FieldCheck.setSuperClassPrivateField(e, "keyChars", "ら");
                    ret = (String) m2.invoke(e, new Object[]{});
                    printResult("らいおん".equals(ret),"メソッドgetHandの戻り値は「らいおん」");
                    printResult(map.containsKey("ら"), "「ら」をキーとするデータが存在する?");
                    if (map.containsKey("ら")) {
                        printResult(map.get("ら").size() == 2, "「ら」をキーとするデータのサイズは2?");
                    }

                    ret = (String) m2.invoke(e, new Object[]{});
                    printResult("らくだ".equals(ret),"メソッドgetHandの戻り値は「らくだ」");
                    printResult(map.containsKey("ら"), "「ら」をキーとするデータが存在すr?");
                    if (map.containsKey("ら")) {
                        printResult(map.get("ら").size() == 1, "「ら」をキーとするデータのサイズは1?");
                    }

                    ret = (String) m2.invoke(e, new Object[]{});
                    printResult("らーめん".equals(ret),"メソッドgetHandの戻り値は「らーめん」");
                    printResult(!map.containsKey("ら"), "「ら」をキーとするデータが存在しない?");
                }


                String[] sTest2 = {"おおさか", "きょうと", "ひょうご", "なら", "わかやま", "しが", "おかやま", "ひろしま", "おおいた"};
                e = con.newInstance("hi", sTest2);
                m2 = e.getClass().getSuperclass().getDeclaredMethod("getHand", new Class<?>[]{});
                m4 = e.getClass().getSuperclass().getDeclaredMethod("makeDictionary", new Class<?>[]{int.class});
                if (m2 != null) {
                    m4.setAccessible(true);
                    m4.invoke(e, new Object[]{2});
                    FieldCheck.setSuperClassPrivateField(e, "keyChars", "きょ");

                    String ret = (String) m2.invoke(e, new Object[]{});
                    Map<String, List<String>> map = (Map<String, List<String>>)FieldCheck.getSuperClassPrivateField(e, "dictionary");

                    printResult("きょうと".equals(ret),"メソッドgetHandの戻り値は「きょうと」");
                    printResult(!map.containsKey("きょ"), "「きょ」をキーとするデータが存在しない?");

                    FieldCheck.setSuperClassPrivateField(e, "keyChars", "ひょ");
                    ret = (String) m2.invoke(e, new Object[]{});

                    printResult("ひょうご".equals(ret),"メソッドgetHandの戻り値は「ひょうご」");
                    printResult(!map.containsKey("ひょ"), "「ひょ」をキーとするデータが存在しない?");

                    FieldCheck.setSuperClassPrivateField(e, "keyChars", "なら");
                    ret = (String) m2.invoke(e, new Object[]{});

                    printResult("なら".equals(ret),"メソッドgetHandの戻り値は「なら」");
                    printResult(!map.containsKey("なら"), "「なら」をキーとするデータが存在しない?");

                    FieldCheck.setSuperClassPrivateField(e, "keyChars", "おお");
                    ret = (String) m2.invoke(e, new Object[]{});

                    printResult("おおさか".equals(ret),"メソッドgetHandの戻り値は「おおさか」");
                    printResult(map.containsKey("おお"), "「おお」をキーとするデータが存在する?");

                    ret = (String) m2.invoke(e, new Object[]{});

                    printResult("おおいた".equals(ret),"メソッドgetHandの戻り値は「おおいた」");
                    printResult(!map.containsKey("おお"), "「おお」をキーとするデータが存在しない?");
}

試したこと

for文のなかでif文を用い,keyCharsに指定データがある場合,getによりkeyCharsの先頭要素を取得しています.またif文によりkeyCharsのリストがからの場合,リストをdictionaryから削除しています.

補足情報(FW/ツールのバージョンなど)

開発環境はEclipseです.
javadocのバージョンですが最新のものと思われますが確認方法がわかりません.
メインメソッドを追加しました.

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • KoichiSugiyama

    2019/05/25 05:19

    > javadocによると
    きっとメソッドの仕様がjavadocで書かれている、ということを説明したいんだと思いますが、ここに書かれている仕様のどのあたりが上手くいっていないのでしょうか。Eclipseであればステップ実行も可能だと思いますので、意図した動作をしない行がどこで、どうなって欲しいかを示すだけでもアドバイスしやすくなると思います。

    キャンセル

  • m.ts10806

    2019/05/25 06:56

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

    キャンセル

  • jimbe

    2019/05/25 10:19

    > きっとメソッドの仕様がjavadocで
    なるほど. 内部構造まで書かれているということは, 作っているというより作らされている=課題ということでしょうか.
    > getHand実装and動作検査
    「メインメソッド」とこれだけ出されましても, コンパイルも出来ません.

    キャンセル

回答 2

0

これほどのテスト用のメソッドが準備されているということは, どちらかの比較的大きなもしくは歴史ある企業の新人向け課題でしょうか.
その場合, 分からない点は担当者にお聞き頂くのが良いかと思います.
問題解決能力の一つとして「質問が出来る」ことは必要ですが, ならば「全くの他人」では無く, まず関係者に聞くのが先ではないでしょうか.

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

根本的に、getHandがnullしか返さないようですが?
wordsとかの変数の意味もわからないので、なんとも言えません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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