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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

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

Q&A

2回答

1298閲覧

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

hinanogi

総合スコア18

Java

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

0グッド

0クリップ

投稿2019/05/24 16:19

編集2019/05/24 23:39

前提・実現したいこと

しりとりをおこなうアプリをつくっています.その際のプレイヤークラスに関するメソッド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のバージョンですが最新のものと思われますが確認方法がわかりません.
メインメソッドを追加しました.

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

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

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

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

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

swordone

2019/05/24 16:30

「うまくいかない」では通じません。 具体的に何がどううまくいかないのか、エラーメッセージが出るのか、こうなる想定が違ったことになるとか、具体的な事象を書いてください。
jimbe

2019/05/24 17:19

> javadocによると 何の javadoc でしょうか. java のバージョンによって異なる場合もありますので, ご使用のバージョンも教えて頂けますか.
KoichiSugiyama

2019/05/24 20:19

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

2019/05/24 21:56

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

2019/05/25 01:19

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

回答2

0

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

投稿2019/05/25 03:05

swordone

総合スコア20651

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

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

0

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

投稿2019/05/25 01:39

jimbe

総合スコア12648

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問