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

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

ただいまの
回答率

88.64%

HashMap endと入力されるまでキーボードからの入力を受け付け endが入力されたらデータを表示する

受付中

回答 4

投稿 編集

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

YattemiYo

score 12

こんにちは。
HashMapについて質問です。
タイトルにありますとおりendと入力されたらそれまでに入力されたデータを出力したいのですがwhile文はどのようにかけばよいのでしょうか。

最後に入力された値しか出力されません。
上書きされないようにするにはどうすればよろしいでしょうか。

また例外処理も文字列以外をいれてもエラーメッセージが表示されません。

改善すべきところをご教授頂きたいです。

package common;

import java.util.HashMap;
import java.util.InputMismatchException;

public class UserDataHashMap {
    public static void userData() {
        //HashMapデータを作成
        HashMap<String, String> hm = new HashMap<String, String>();

        boolean isConti = true;
        while (isConti) {
             //endと入力されるまでユーザー名の入力を求める
             System.out.println("入力してください");
            String inputData = new java.util.Scanner(System.in).nextLine();

            try {    
                if (inputData.equals("end")) {
                isConti = false;
            } else {

                String userName = inputData;
                hm.put("name", userName);
            }
            }catch(InputMismatchException e){
                System.out.println("不正データです");
            }



        }

        //画面表示
        System.out.println("name: " + hm.get("name"));

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • 退会済みユーザー

    退会済みユーザー

    2018/11/19 22:23

    HashMapに限らずMapは、キーと値をペアにして値を保存します。そしてこのキーは重複せず、同じキーが指定された際はそのキーが差していた値を上書きします。このコードでは"name"というString型のキーを使い続けているので、毎回値は上書きされます。このようなケースにあったCollectionはList系、特に今回はArrayListでしょう。

    キャンセル

  • YattemiYo

    2018/11/19 22:34

    根本的なことから理解できておらず恐縮ですがキーは一意なので、という認識でよろしいでしょうか。また、キーはその名前と数はあらかじめ決めておかなければならないのでしょうか。ユーザーが入力するたびにキーも増えていくというのは不可能でしょうか。Listを使わずに名前データを一覧表示するよう課題が出た為質問させていただきました。

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2018/11/19 22:42

    キーは一意であるということは合っています。が、数や名前はputメソッドを使うたびに(重複がない限りは)キーの数は増えていきます。もちろんですが、削除もできます。この状況でListを使わないようにする理由はないですし、そんな課題もやる意味があるのかどうかは怪しいですが、固有の整数のID(SQLでいう主キーのようなもの)をキーにすれば可能ではあります。

    キャンセル

回答 4

+1

そもそもハッシュマップの使い方を根本的に間違えています。

ハッシュマップは key 対 value をマッピングしたいときに使います。
例えば、idと名前など。

イメージ

key  -> value
--------------
1    -> Yamada
2    -> Tanaka
3    -> Suzuki

単に複数の値を保持したいだけなら、リストを用いてください。


なお、ご提示のコードのフラグ変数isContiは不要です。
ループを抜けるときはbreakを使います。

while(true) {
    if(条件) {
        ...
        break
    }

    ...
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/11/19 22:35

    根本的なことから理解できておらず恐縮ですがキーは一意なので、という認識でよろしいでしょうか。また、キーはその名前と数はあらかじめ決めておかなければならないのでしょうか。ユーザーが入力するたびにキーも増えていくというのは不可能でしょうか。Listを使わずに名前データを一覧表示するよう課題が出た為質問させていただきました。
    while文の件もご指摘ありがとうございます。

    キャンセル

  • 2018/11/19 22:41 編集

    > キーは一意なので、という認識でよろしいでしょうか。

    はい。
    改めて同じキーに値を登録しようとすると上書きされます。


    > キーはその名前と数はあらかじめ決めておかなければならないのでしょうか。

    名前も件数も、動的に決定できます。


    > Listを使わずに名前データを一覧表示する

    Listを使うのがベストな場面でListを使っていけないのは変ですね。
    何か見落としている条件があるんじゃないかと思います。
    名前を順に格納していくだけではなく、他の情報を結び付けるような指示はありませんか。

    キャンセル

  • 2018/11/19 22:49

    ご回答ありがとうございます。
    経緯としてはArrayListでの要素の格納と取り出しを学習してからHashMapで応用するように言われました。一覧表に見えるように個人で工夫してデータとして出力できるようにするべきなのかもしれません、キーをそのままnameにするのではなく記載していただいたイメージのように番号などに変えてコーディングしてみます。
    ありがとうございます。

    キャンセル

+1

Mapのキーに指定した値が重複した場合は内容が上書きされます。
単に入力した値をため込んでおきたいなら、MapではなくListで十分ではないでしょうか。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/11/19 22:35

    根本的なことから理解できておらず恐縮ですがキーは一意なので、という認識でよろしいでしょうか。
    また、キーはその名前と数はあらかじめ決めておかなければならないのでしょうか。ユーザーが入力するたびにキーも増えていくというのは不可能でしょうか。Listを使わずに名前データを一覧表示するよう課題が出た為質問させていただきました。

    キャンセル

0

ひょっとして逆では?
入力をキーとして入れれば、Listでは面倒な入力の重複の排除ができます。

    public static void userData() {
        //HashMapデータを作成
        HashMap<String, String> hm = new HashMap<String, String>();
        Scanner input = new java.util.Scanner(System.in);

        while (true) {
            //endと入力されるまでユーザー名の入力を求める
            System.out.println("入力してください");
            String inputData = input.nextLine();


            if (inputData.equals("end")) {
                break;
            } else {
                String userName = inputData;
                hm.put(userName, "name");
            }
        }

        //画面表示 キーの取り出しはkeySet()でできる
        for (String s : hm.keySet())
            System.out.println("name: " + s);

    }


実際HashSetではこういう仕組みでSetの要件である「重複を許さないコレクション」を実現しています。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

hm.put("name", userName);
の部分を

hm.put("name", (hm.get(“name”) != null) ? hm.get(“name”) + userName : userName);


としてみる。

InputMismatchExceptionは想定外の入力があった場合発生する例外。
今回のケースでは文字列を取り込もうとしているので、文字列以外でこの例外が発生。
キーボードの入力は、全部文字列扱いされるため、文字列以外の入力はできない。
つまり、この例外は発生しない。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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

  • トップ
  • Javaに関する質問
  • HashMap endと入力されるまでキーボードからの入力を受け付け endが入力されたらデータを表示する