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