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

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

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

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

Q&A

3回答

2057閲覧

Java List中の重複回数を扱いたい

shiro97

総合スコア0

Java

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

0グッド

0クリップ

投稿2020/09/25 04:37

編集2020/09/25 07:01

前提・実現したいこと

キーボードから半角数字1~5(5が入力された時点で終了)の入力を受け付け、
それをリストに追加していきます。
リストに追加された各数字の入力回数が奇数か偶数かによって、
異なるメッセージを表示させるというプログラムを作りたいです。
(※Switch文での場合分けを記述し忘れてしまったため追記しております)

ex:
2が2回入力されている(2がリスト中に2つある)場合は「△△△」
1が3回入力されている(1がリスト中に3つある)場合は「〇〇〇」
4が5回入力されている場合も「〇〇〇」、というふうに表示させたいです。

入力された数字をListに格納するところまでしかできませんでした。
Mapは使わず、Listでの処理を指定されています。

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

エラーメッセージ

該当のソースコード

Java

1import java.io.BufferedReader; 2import java.io.InputStreamReader; 3import java.util.ArrayList; 4 5public class MainDemo { 6 7 public static void main(String args[]) throws Exception { 8 9 // リストの準備 10 ArrayList<Integer> list = new ArrayList<Integer>(); 11 12 while (true) { 13 System.out.println("1~5の数字を半角で入力して下さい"); 14 15 // キーボードからの入力 16 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 17 int no = Integer.parseInt( br.readLine() ); 18 19 // 5が入力された場合 20 int five = 5; 21 if ( five == no ) { 22 System.out.println("終了します"); 23 break; 24 } 25 26 // 入力された文字をリストに格納 27 list.add(no); 28 29 // if(list.contains(no)) { 30 // System.out.println("配列内に値が存在しています。"); 31 // } 32 // 33 34 switch(no) { 35 case 1: 36 if ( 入力回数%2 != 0 ) { 37 System.out.println("○○○"); 38 }else { 39 System.out.println("△△△"); 40 } 41 break; 42 case 2: 43 if ( 入力回数%2 != 0 ) { 44 System.out.println("○○○"); 45 }else { 46 System.out.println("△△△"); 47 } 48 break; 49 case 3: 50 if ( 入力回数%2 != 0 ) { 51 System.out.println("○○○"); 52 }else { 53 System.out.println("△△△"); 54 } 55 break; 56 case 4: 57 if ( 入力回数%2 != 0 ) { 58 System.out.println("○○○"); 59 }else { 60 System.out.println("△△△"); 61 } 62 break; 63 } 64 } 65 } 66}

試したこと

for文でList内に重複している数字があるかを調べ、
その個数が偶数か奇数かによって場合分けをしようと思ったのですが、
重複の有無はわかっても、何回重複しているかを調べる方法を見つけられませんでした。
入力回数を変数としてSwitch文中のif文内で扱いたいです。
初歩的な問題でつまづいており恐縮ですが、よろしければアドバイスいただけると幸いです。

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

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

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

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

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

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

shiketa

2020/09/25 05:26

# あらら。コメントにつもりで回答に書いちゃったわ。取り消し依頼しときます。 添付されたソースを眺めても重複の有無はチェックできていないようですが。 まそれはいいです。2が入力されたら、2だけのリストを作って、そのサイズを...。皆まで言わずに置きます。課題。がんばって取り組んでください。
m.ts10806

2020/09/25 05:38

>Mapは使わず、Listでの処理を指定されています。 何の話でしょうか。 課題でしたら出題者に聞くべきでは。
shiro97

2020/09/25 05:40

アドバイスありがとうございます。重複の確認は、それのみで回数の確認までできていないので載せておりませんでしたが、コメントアウトして載せておきました。頑張ります!
guest

回答3

0

Java

1list.add(no); 2int count = 0; //入力回数 3for(int i : list) { 4 if(i == no) { 5 count++; 6 } 7}

リストの中身を1つずつ出して入力された値と一致した時だけ加算します。

投稿2020/09/25 09:47

k_n_h_r

総合スコア58

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

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

0

あれ?問題読み間違えてるかな・・・
ただ、カウントすればいいだけじゃないの?

java

1int[] cnt = new int[5]; //cnt[0]は、使わない 2for(int i : list) { 3 cnt[i] = cnt[i] + 1; 4} 5 6for(int i = 1; i <= 4; i++) { 7 System.out.println(cnt[i] % 2 == 0 ? "△△△" : "〇〇〇"); 8}

つど出力する場合

java

1int[] cnt = new int[5]; 2while(true) { 3 // 中略 4 cnt[no] = cnt[no] + 1; 5 6 System.out.println(cnt[no] % 2 == 0 ? "△△△" : "〇〇〇"); 7}

わからん。こんなんでいいのか。

投稿2020/09/25 07:45

編集2020/09/25 07:58
momon-ga

総合スコア4826

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

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

momon-ga

2020/09/25 07:48

あー。つど結果を出力するのね。 あとで、修正します。
momon-ga

2020/09/25 07:52

うーーーん。MapどころかListも本質的には、いらなくなってしまった(ただ、追加してるだけ)
guest

0

リスト内の要素を数えて1~4の数字がキーの二次元配列を作成するやり方です。
Stream-API使うと大分短く書けますが、
わからないかも知れませんので従来のfor文の処理もコメントアウトで残してあります。

java

1 public static void main(String[] args) { 2 int[] key = {1, 2, 3, 4}; 3 // リストの準備 4 List<Integer> list = new ArrayList<Integer>(); 5 6 Scanner sc = new Scanner(System.in); 7 while (true) { 8 System.out.println("1~5の数字を半角で入力して下さい"); 9 10 // キーボードからの入力 11 int no = Integer.parseInt(sc.nextLine()); 12 13 // 5が入力された場合 14 int five = 5; 15 if (five == no) { 16 System.out.println("終了します"); 17 break; 18 } 19 20 // 入力された文字をリストに格納 21 list.add(no); 22 23 // [数字, 数字の入力回数]の形式の配列を含んだ二次元配列を作成 24 // Stream-API 25 int[][] cntAry = 26 Arrays.stream(key) 27 .mapToObj(k -> new int[] {k, (int)list.stream().filter(i -> i == k).count()}) 28 .toArray(int[][]::new); 29 // 非Stream-API 30// int[][] cntAry = new int[key.length][2]; 31// for (int i = 0; i < key.length; i++) { 32// int k = key[i]; 33// int count = 0; 34// for (int v : list) { 35// if (k == v) { 36// count++; 37// } 38// } 39// cntAry[i] = new int[] {k, count}; 40// } 41 42 // 二次元配列をループさせ結果を書き出す 43 for (int[] cnt : cntAry) { 44 // 2が2回入力されている 45 if (cnt[0] == key[1] && cnt[1] == 2) { 46 System.out.println("△△△"); 47 } 48 // 1が3回入力されている 49 // 4が5回入力されている 50 else if ((cnt[0] == key[0] && cnt[1] == 3) 51 || (cnt[0] == key[3] && cnt[1] == 5)) { 52 System.out.println("〇〇〇"); 53 } 54 } 55 } 56 sc.close(); 57 } 58

投稿2020/09/25 06:07

yureighost

総合スコア2183

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問