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

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

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

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

Q&A

1回答

553閲覧

なぜかHashSetのcontainsがうまく動きません。

F.Yosida

総合スコア4

Java

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

0グッド

1クリップ

投稿2018/04/03 09:12

前提・実現したいこと

クイズのゲームです。なぜかcontainsがうまく動きません。
hashCodeを使うといいと聞いてエクリプスの機能で実装してみましたがうまくいきませんでした。

注釈
問題文や選択肢の部分には不具合はないものとする。jarの中身も同様。
(あえて読めないようにしてあるので、その部分は調査しなくて良い)

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

以下のcontainがうまく動きません

java

1 2if (!usedQuestions.contains(question)) { 3 usedQuestions.add(question); 4 return question; 5 }```

該当のソースコード

java

1package jp.co.bbreak.debugchallenge; 2 3import java.io.File; 4import java.io.FileInputStream; 5import java.io.IOException; 6import java.io.ObjectInputStream; 7import java.nio.charset.Charset; 8import java.nio.file.Files; 9import java.nio.file.Path; 10import java.nio.file.Paths; 11import java.util.ArrayList; 12import java.util.HashSet; 13import java.util.List; 14import java.util.Random; 15import java.util.Scanner; 16import java.util.Set; 17 18import org.apache.commons.lang3.StringUtils; 19 20/** 21 * クイズゲーム 22 * 23 * @author Kenta Kawasaki 24 */ 25public class Quiz { 26 27 /** 成績 */ 28 private final QuizScore score = new QuizScore(); 29 30 /** 問題リスト */ 31 private final List<String> questionPaths = new ArrayList<>(); 32 33 /** 使用済みの問題 */ 34 private final Set<Question> usedQuestions = new HashSet<>(); 35 36 /** 37 * エントリポイント 38 * 39 * @param args 40 */ 41 public static void main(String[] args) { 42 Quiz quiz = new Quiz(); 43 quiz.play(); 44 } 45 46 /** 47 * コンストラクタ 48 */ 49 public Quiz() { 50 questionPaths.addAll(loadQuestionPaths()); 51 } 52 53 /** 54 * クイズを出す 55 */ 56 public void play() { 57 for (int i = 0; i < questionPaths.size(); i++) { 58 Question question = selectQuestion(); 59 set(question); 60 System.out.println("----------------------------------------"); 61 } 62 showResult(); 63 } 64 65 /** 66 * 次に出題する問題を選んで返す。 67 * @return 出題する問題 68 */ 69 public Question selectQuestion() { 70 while (true) { 71 // ランダムに1問選ぶ 72 int idx = new Random().nextInt(questionPaths.size()); 73 Question question = loadQuestion(questionPaths.get(idx)); 74 if (!usedQuestions.contains(question)) { 75 usedQuestions.add(question); 76 return question; 77 } 78 } 79 } 80 81 /** 82 * クイズを出題する。 83 * 84 * @param questionNo 85 * 問題番号 86 * @param question 87 * 出題する問い 88 */ 89 private void set(Question question) { 90 question.show(); 91 92 boolean isCorrectAnswer; 93 while (true) { 94 String yourAnswer = chooseAnswer(); 95 if (question.hasAnswer(yourAnswer)) { 96 isCorrectAnswer = question.answer(yourAnswer); 97 break; 98 } else { 99 if (StringUtils.isEmpty(yourAnswer)) { 100 System.out.println("回答が選択されていません。"); 101 } else { 102 System.out.println(yourAnswer + " は回答の選択肢に存在しません。"); 103 } 104 } 105 } 106 107 if (isCorrectAnswer) { 108 System.out.println("正解です"); 109 score.incrementCorrectCount(); 110 } else { 111 System.out.println("間違いです"); 112 score.incrementIncorrectCount(); 113 } 114 } 115 116 /** 117 * ユーザに回答を選択させます。 118 * 119 * @return ユーザの選択した回答 120 */ 121 private String chooseAnswer() { 122 System.out.print("あなたの回答:"); 123 @SuppressWarnings("resource") 124 final String yourAnswer = new Scanner(System.in).nextLine(); 125 return yourAnswer; 126 } 127 128 /** 129 * 結果を表示する。 130 */ 131 private void showResult() { 132 System.out.println("正解率:" + score.getCorrectAnswerPercentage() + "%"); 133 } 134 135 /** 136 * 問題リストのパスを読み込む。 137 * 138 * @return 139 */ 140 private List<String> loadQuestionPaths() { 141 try { 142 Path path = Paths.get("resource/questions.txt"); 143 return Files.readAllLines(path, Charset.defaultCharset()); 144 } catch (IOException e) { 145 // 課題の趣旨と関係ないので省略 146 throw new RuntimeException("問題ファイルの読み込みに失敗しました"); 147 } 148 } 149 150 /** 151 * 指定ファイルの問題を読み込む。 152 * 153 * @return 154 */ 155 private Question loadQuestion(String filePath) { 156 File file = Paths.get(filePath).toFile(); 157 try (FileInputStream s = new FileInputStream(file); 158 ObjectInputStream o = new ObjectInputStream(s)) { 159 160 Question question = (Question) o.readObject(); 161 return question; 162 } catch (IOException | ClassNotFoundException e) { 163 // 課題の趣旨と関係ないので省略 164 throw new RuntimeException("問題ファイルの読み込みに失敗しました"); 165 } 166 } 167} 168

java

1package jp.co.bbreak.debugchallenge; 2 3import java.io.Serializable; 4import java.util.ArrayList; 5import java.util.List; 6 7import org.apache.commons.lang3.math.NumberUtils; 8 9/** 10 * クイズゲーム:問題 11 * 12 * @author Kenta Kawasaki 13 */ 14public class Question implements Serializable { 15 16 private static final long serialVersionUID = 9185957365396112593L; 17 18 /** 問題文 */ 19 private String sentence; 20 21 /** 選択肢のリスト */ 22 private List<Answer> answers = new ArrayList<>(); 23 24 /** 25 * 問題文を取得します。 26 * 27 * @return 問題文 28 */ 29 public String getSentence() { 30 return sentence; 31 } 32 33 /** 34 * クイズに回答します。 35 * 36 * @param yourAnswer 37 * 選択された回答番号 38 * @return 回答が正解かどうか。正解を選択していればtrue、それ以外はfalse 39 */ 40 public boolean answer(final String selectedAnswerString) { 41 if (!NumberUtils.isNumber(selectedAnswerString)) { 42 // #hasAnswer() でtrueになった値であればここは通らない 43 throw new NumberFormatException(); 44 } 45 46 int selectedAnswer = NumberUtils.toInt(selectedAnswerString); 47 for (final Answer answer : answers) { 48 if (answer.getAnswerIndex() == selectedAnswer) { 49 return answer.isCorrect(); 50 } 51 } 52 throw new IllegalStateException(selectedAnswerString + "は存在しない回答番号です。"); 53 } 54 55 /** 56 * 問題を表示します。 57 */ 58 public void show() { 59 final StringBuilder builder = new StringBuilder(); 60 builder.append(sentence + "\n\n"); 61 for (Answer answer : answers) { 62 builder.append(answer.getSentence() + "\n"); 63 } 64 System.out.println(builder.toString()); 65 } 66 67 /** 68 * 与えられた回答が選択肢として存在する場合、trueを返します。 69 * 70 * @param selectedAnswerString 71 * @return 回答が存在する場合true、それ以外はfalse 72 */ 73 public boolean hasAnswer(final String selectedAnswerString) { 74 if (NumberUtils.isNumber(selectedAnswerString)) { 75 int selectedAnswer = NumberUtils.toInt(selectedAnswerString); 76 for (final Answer answer : answers) { 77 if (answer.getAnswerIndex() == selectedAnswer) { 78 return true; 79 } 80 } 81 } 82 return false; 83 } 84} 85

java

1package jp.co.bbreak.debugchallenge; 2 3import java.io.Serializable; 4 5/** 6 * クイズゲーム:回答 7 * 8 * @author Kenta Kawasaki 9 */ 10public class Answer implements Serializable { 11 12 private static final long serialVersionUID = -2607171250093907133L; 13 14 /** 回答 */ 15 private String sentence; 16 17 /** 回答番号 */ 18 private int answerIndex; 19 20 /** 正解フラグ */ 21 private boolean correct = false; 22 23 /** 24 * 回答を取得します。 25 * 26 * @return 27 */ 28 public String getSentence() { 29 return answerIndex + ": " + sentence; 30 } 31 32 /** 33 * 回答番号を取得します。 34 * 35 * @return 36 */ 37 public int getAnswerIndex() { 38 return answerIndex; 39 } 40 41 /** 42 * この回答が正しければ、trueを返します。 43 * 44 * @return 回答が正しければtrue、間違っていればfalse 45 */ 46 public boolean isCorrect() { 47 return correct; 48 } 49} 50

試したこと

ここに問題に対して試したことを記載してください。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

Udomomo

2018/04/03 09:31

具体的にどんなエラーメッセージが出たのでしょうか?
退会済みユーザー

退会済みユーザー

2018/04/03 09:37

jp.co.bbreak.debugchallenge;  会社名出ちゃいますが(修正で削除しても履歴で見れます)
退会済みユーザー

退会済みユーザー

2018/04/03 09:45

ハッシュコードの実装方法がわかってない情報漏洩予備軍なんじゃない?
deadjupiter

2018/04/03 20:47

Kenta Kawasaki泣いてそう
guest

回答1

0

hashCodeを実装したと言いつつコードにそれが無いようですが…?

投稿2018/04/03 11:00

swordone

総合スコア20651

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問