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

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

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

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Java

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

Q&A

解決済

5回答

2903閲覧

二重for文に入って処理をしません

gyro16

総合スコア89

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Java

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

0グッド

0クリップ

投稿2016/04/25 23:39

編集2016/04/26 00:24

二重for文に入って処理をしません

HashMap<String, Integer> course
Stringはコース名、Integerは回数カウント
ArrayList<String> listCourse
Stringは目的のコース名

Map.Entry<String, Integer>も使用

public static void sortDisplay(){//降順に画面表示する
int maxCount = 0;
for(Object obj : course.entrySet()){
Map.Entry<String, Integer> entry = (Map.Entry) obj;
if(maxCount < entry.getValue()){
maxCount = entry.getValue();//最大回数へ代入
}
}
System.out.println(listCourse.get(0));//ここは表示される

for(int i = maxCount; i > 0; i--)//修正しましたが、まだ二重for文を処理しません・・・ここが問題の二重for文です /*for(int i = maxCount; i < 0; i--){//最大回数から回して、表示する・・・ここが問題の二重for*/ for(Object obj : course.entrySet()){ Map.Entry<String, Integer> entry = (Map.Entry) obj; if(i == entry.getValue()){//iと回数カウントが等しい時、キー:コースと値:回数カウントを表示する System.out.println(entry.getKey() + ":" + entry.getValue()); } } } System.out.println("表示一覧を終了します");//ここは表示される }

この二重for文に入って処理をしません

他のソースは以下

import java.util.Scanner;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

public class CourseKeiba {
static ArrayList<String> listCourse;
static HashMap<String, Integer> course;

public static void main(String[] args){ screenInput(); sortDisplay(); } public static void screenInput(){//画面から入力する int count = 0;//回数カウント、初期値0 System.out.println("対象コースを入力して下さい"); String target = new Scanner(System.in).nextLine(); listCourse = new ArrayList<String>(); listCourse.add(target); while(true){ System.out.println("第1コースデータを入力して下さい"); String firstCourse = new Scanner(System.in).nextLine(); course = new HashMap<String, Integer>(); if(firstCourse.equals("9999")){//無限ループを抜ける入力"9999"があったら System.out.println("入力を終了します"); break;//無限ループを抜ける } if(course.isEmpty() == true){ count = 1;//カウントは1にする }else{ for(String key : course.keySet()){ if(key.equals(firstCourse)){ count++;//同じコース名があったら、回数カウントと+1する } } } course.put(firstCourse, count); count = 1;//HashMapにデータを置いたら、回数カウントは1にする System.out.println("第2コースデータを入力して下さい"); String secondCourse = new Scanner(System.in).nextLine(); for(String key : course.keySet()){ if(key.equals(secondCourse)){ count++;//同じコース名があったら、回数カウントを+1する } } course.put(secondCourse, count); count = 1;//HashMapにデータを置いたら回数カウントは1に戻す } }

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

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

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

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

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

guest

回答5

0

ベストアンサー

java

1while(true){ 2 System.out.println("第1コースデータを入力して下さい"); 3 String firstCourse = new Scanner(System.in).nextLine(); 4 course = new HashMap<String, Integer>(); // <-ここ 5 6 // 無限ループを抜ける唯一のタイミング 7 if(firstCourse.equals("9999")){ 8 System.out.println("入力を終了します"); 9 break; 10 }

screenInput()メソッドの無限ループ処理で、ループの最初にcourseのHashMapを新規に生成しています。
この操作のたびにcourseは空になってしまい、ループを抜けるタイミングがここしかないため、courseが空のまま次のsortDisplay()に入っています。
courseが空のため、sortDisplay()での最初のループも実は入っておらず、なにもしないまま

java

1System.out.println(listCourse.get(0));//ここは表示される

が処理され、その次のループもcourseが空のためループに入らず、

java

1System.out.println("表示一覧を終了します");//ここは表示される

が処理されている、というだけの話です。


そもそも無駄な処理が多すぎます。HashMapを使っているのですから、キーを探すのにループする必要はありません。screenInput()でのArrayListの存在意義も不明です。
おそらく最初のメソッドでやりたいのはこういうことですよね?

java

1public static void screenInput(){//画面から入力する 2 int count = 0; 3 course = new HashMap<String, Integer>(); 4 5 while(true){ 6 count++; 7 System.out.println("第" + count + "コースデータを入力して下さい"); 8 String firstCourse = new Scanner(System.in).nextLine(); 9 10 if(firstCourse.equals("9999")){//無限ループを抜ける入力"9999"があったら 11 System.out.println("入力を終了します"); 12 return;//無限ループを抜ける メソッドから抜けるreturnでOK 13 } 14 Integer now = course.get(firstCourse); 15 if(now == null){ 16 course.put(firstCourse, 1); 17 }else{ 18 course.put(firstCourse, now + 1); 19 } 20 } 21}

そしてその後の並び替えは前の方の回答通りキャストが無駄ですし、Map.Entry<String, Integer>でリスト化してソートアルゴリズム使えばいいだけの話なのでは?

投稿2016/04/26 01:07

編集2016/04/26 01:35
swordone

総合スコア20649

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

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

0

外側のfor文で、int i が最大値を取るのに、
次の条件で i が 0 より小さい場合 としているため、
条件を満たさずにfor文に入っていません。

unauさんのおっしゃっているように、for文の条件文を見直してください。

for文やif文の中の処理をしてくれない場合は、必ず条件が満たされていないので、
条件としている変数の中身をログ出しする等、見直すようにするといいですよ。

投稿2016/04/26 00:08

編集2016/04/26 00:09
kaputaros

総合スコア1844

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

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

gyro16

2016/04/26 00:21

条件式を i > 0 にしました。ケアレスミスです、すみません。 ですが、まだ二重for文を処理しません。
kaputaros

2016/04/26 00:32 編集

・どこまで処理が行っているか ・条件になっている変数がどういう値なのか こちら、ログ出しして確認されましたでしょうか? 1行処理終わったらSystem.out.println()等でログ出してみてください。 また、別件なのですが、HashMapを使っている理由はなんでしょうか? 最大値を取るのが目的なのであれば、TreeMap等並べ替えを自動で行ってくれる便利クラスがあるので、そちらを利用した方がfor文の数を減らせるかと。 http://docs.oracle.com/javase/jp/8/docs/api/java/util/TreeMap.html
kaputaros

2016/04/26 01:14 編集

あと、気になる点なのですが、 むやみにstaticフィールドやstaticメソッドを使わないほうがいいです。 今は自分で勉強する際に使っているだけなので問題ないかと思いますが、 業務で使う場合は、多方から呼び出されることを想定しなくてはならないので、 想定外の値になってしまう可能性があるので、注意が必要です。 例) staticフィールドは呼出元が違う処理でも、常に同じ場所を書き換えするので、 1、A処理で staticフィールドX に aaa を設定 2、B処理で staticフィールドX に bbb を設定 3、A処理で staticフィールドX に aaa が入っていることを想定した処理を実行しエラー なんてことも。 あと、HashMapも APIにも書いてありますが、synchronizedされないクラスなので、想定外な値を返すこともあり得ます。 使うクラスにも注意が必要です。
guest

0

おかしいですねぇ。
これで動きますよ?

java

1public static void main (String[] args) throws java.lang.Exception 2{ 3 HashMap<String, Integer> course = new HashMap<String, Integer>(); 4 course.put("a", 10); 5 course.put("b", 20); 6 course.put("c", 15); 7 8 int maxCount = 0; 9 for(Map.Entry<String, Integer> entry : course.entrySet()){ 10 //Map.Entry<String, Integer> entry = (Map.Entry) obj;//ここのCastは無駄 11 if(maxCount < entry.getValue()){ 12 maxCount = entry.getValue();//最大回数へ代入 13 } 14 } 15 //System.out.println(listCourse.get(0));//ここは表示される 16 17 for(int i = maxCount; i > 0; i--){ //修正しましたが、まだ二重for文を処理しません・・・ここが問題の二重for文です 18 for(Map.Entry<String, Integer> entry : course.entrySet()){ 19 //Map.Entry<String, Integer> entry = (Map.Entry) obj;//ここのCastは無駄 20 if(i == entry.getValue()){//iと回数カウントが等しい時、キー:コースと値:回数カウントを表示する 21 System.out.println(entry.getKey() + ":" + entry.getValue()); 22 } 23 } 24 } 25 System.out.println("表示一覧を終了します");//ここは表示される 26} 27/* output 28b:20 29c:15 30a:10 31表示一覧を終了します 32*/

質問ソースに記載していない余計な処理がありませんか?

投稿2016/04/26 01:02

tkturbo

総合スコア5572

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

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

0

どこまで動作しているのかを実際に追跡してみてはどうですか?

・外側のforの中が処理されていない可能性
→forの中でiを表示してみればわかる/forの前でmaxCountを表示してみればわかる

・外側のforには入ってきてるけど内側のforの中が処理されない
→上と同様に内側のforの中でも条件判定その他一切せず何かをただ表示させてみればわかる

・内側のforには入ってるけど目的の物が表示されていない
→(i == entry.getValue()) の判定前にiとentry.getvalue()のそれぞれを表示してみればわかる

想像しても分からない場合は「具体的にどこまでどういう値で動作しているのかを追跡確認する」と一気に答えに近づきますよ。

投稿2016/04/26 00:42

HiroshiWatanabe

総合スコア2160

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

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

0

for(int i = maxCount; i < 0; i--){for(int i = maxCount; i >= 0; i--){ とか?

投稿2016/04/25 23:50

unau

総合スコア2468

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

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

gyro16

2016/04/26 00:21

条件式を i > 0 にしました。ケアレスミスです、すみません。 ですが、まだ二重for文を処理しません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問