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

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

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

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

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

Q&A

4回答

3280閲覧

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

YattemiYo

総合スコア12

Java

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

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

0グッド

0クリップ

投稿2018/11/19 13:15

編集2022/01/12 10:55

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

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

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

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

Java

1package common; 2 3import java.util.HashMap; 4import java.util.InputMismatchException; 5 6public class UserDataHashMap { 7 public static void userData() { 8 //HashMapデータを作成 9 HashMap<String, String> hm = new HashMap<String, String>(); 10 11 boolean isConti = true; 12 while (isConti) { 13             //endと入力されるまでユーザー名の入力を求める 14             System.out.println("入力してください"); 15 String inputData = new java.util.Scanner(System.in).nextLine(); 16 17 try { 18 if (inputData.equals("end")) { 19 isConti = false; 20 } else { 21 22 String userName = inputData; 23 hm.put("name", userName); 24 } 25 }catch(InputMismatchException e){ 26 System.out.println("不正データです"); 27 } 28 29 30 31 } 32 33 //画面表示 34 System.out.println("name: " + hm.get("name")); 35 36 } 37}

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/11/19 13:23

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

2018/11/19 13:34

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

退会済みユーザー

2018/11/19 13:42

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

回答4

0

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

投稿2018/11/19 13:22

A-pZ

総合スコア12011

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

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

YattemiYo

2018/11/19 13:35

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

0

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

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

イメージ

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

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


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

Java

1while(true) { 2 if(条件) { 3 ... 4 break 5 } 6 7 ... 8}

投稿2018/11/19 13:20

編集2018/11/19 13:24
LouiS0616

総合スコア35658

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

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

YattemiYo

2018/11/19 13:35

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

2018/11/19 13:42 編集

> キーは一意なので、という認識でよろしいでしょうか。 はい。 改めて同じキーに値を登録しようとすると上書きされます。 > キーはその名前と数はあらかじめ決めておかなければならないのでしょうか。 名前も件数も、動的に決定できます。 > Listを使わずに名前データを一覧表示する Listを使うのがベストな場面でListを使っていけないのは変ですね。 何か見落としている条件があるんじゃないかと思います。 名前を順に格納していくだけではなく、他の情報を結び付けるような指示はありませんか。
YattemiYo

2018/11/19 13:49

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

0

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

Java

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

としてみる。

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

投稿2019/01/01 18:25

TetsujiMiwa

総合スコア1124

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

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

0

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

java

1 public static void userData() { 2 //HashMapデータを作成 3 HashMap<String, String> hm = new HashMap<String, String>(); 4 Scanner input = new java.util.Scanner(System.in); 5 6 while (true) { 7 //endと入力されるまでユーザー名の入力を求める 8 System.out.println("入力してください"); 9 String inputData = input.nextLine(); 10 11 12 if (inputData.equals("end")) { 13 break; 14 } else { 15 String userName = inputData; 16 hm.put(userName, "name"); 17 } 18 } 19 20 //画面表示 キーの取り出しはkeySet()でできる 21 for (String s : hm.keySet()) 22 System.out.println("name: " + s); 23 24 }

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

投稿2018/11/20 00:34

swordone

総合スコア20649

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問