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

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

ただいまの
回答率

88.59%

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

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 234

shiro97

score 0

前提・実現したいこと

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

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

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

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

エラーメッセージ

該当のソースコード

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class MainDemo {

    public static void main(String args[]) throws Exception {

        // リストの準備
        ArrayList<Integer> list = new ArrayList<Integer>();

        while (true) {
            System.out.println("1~5の数字を半角で入力して下さい");

            // キーボードからの入力
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            int no = Integer.parseInt( br.readLine() );

            // 5が入力された場合
            int five = 5;
            if ( five == no ) {
                System.out.println("終了します");
                break;
            }

            // 入力された文字をリストに格納
            list.add(no);

            //            if(list.contains(no)) {
            //                System.out.println("配列内に値が存在しています。");
            //            }
            //

            switch(no) {
            case 1:
                if ( 入力回数%2 != 0 ) {
                    System.out.println("○○○");
                }else {
                    System.out.println("△△△");
                }
                break;
            case 2:
                if ( 入力回数%2 != 0 ) {
                    System.out.println("○○○");
                }else {
                    System.out.println("△△△");
                }
                break;
            case 3:
                if ( 入力回数%2 != 0 ) {
                    System.out.println("○○○");
                }else {
                    System.out.println("△△△");
                }
                break;
            case 4:
                if ( 入力回数%2 != 0 ) {
                    System.out.println("○○○");
                }else {
                    System.out.println("△△△");
                }
                break;
            }
        }
    }
}

試したこと

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

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • shiketa

    2020/09/25 14:26

    # あらら。コメントにつもりで回答に書いちゃったわ。取り消し依頼しときます。

    添付されたソースを眺めても重複の有無はチェックできていないようですが。

    まそれはいいです。2が入力されたら、2だけのリストを作って、そのサイズを...。皆まで言わずに置きます。課題。がんばって取り組んでください。

    キャンセル

  • m.ts10806

    2020/09/25 14:38

    >Mapは使わず、Listでの処理を指定されています。

    何の話でしょうか。
    課題でしたら出題者に聞くべきでは。

    キャンセル

  • shiro97

    2020/09/25 14:40

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

    キャンセル

回答 3

0

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

    public static void main(String[] args) {
        int[] key = {1, 2, 3, 4};
        // リストの準備
        List<Integer> list = new ArrayList<Integer>();

        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("1~5の数字を半角で入力して下さい");

            // キーボードからの入力
            int no = Integer.parseInt(sc.nextLine());

            // 5が入力された場合
            int five = 5;
            if (five == no) {
                System.out.println("終了します");
                break;
            }

            // 入力された文字をリストに格納
            list.add(no);

            // [数字, 数字の入力回数]の形式の配列を含んだ二次元配列を作成
            // Stream-API
            int[][] cntAry =
                Arrays.stream(key)
                    .mapToObj(k -> new int[] {k, (int)list.stream().filter(i -> i == k).count()})
                    .toArray(int[][]::new);
            // 非Stream-API
//            int[][] cntAry = new int[key.length][2];
//            for (int i = 0; i < key.length; i++) {
//                int k = key[i];
//                int count = 0;
//                for (int v : list) {
//                    if (k == v) {
//                        count++;
//                    }
//                }
//                cntAry[i] = new int[] {k, count};
//            }

            // 二次元配列をループさせ結果を書き出す
            for (int[] cnt : cntAry) {
                // 2が2回入力されている
                if (cnt[0] == key[1] && cnt[1] == 2) {
                    System.out.println("△△△");
                }
                // 1が3回入力されている
                // 4が5回入力されている
                else if ((cnt[0] == key[0] && cnt[1] == 3)
                        || (cnt[0] == key[3] && cnt[1] == 5)) {
                    System.out.println("〇〇〇");
                }
            }
        }
        sc.close();
    }

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

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

int[] cnt = new int[5]; //cnt[0]は、使わない
for(int i : list) {
    cnt[i] = cnt[i] + 1;
}

for(int i = 1; i <= 4; i++) {
    System.out.println(cnt[i] % 2 == 0 ? "△△△" : "〇〇〇");
}

つど出力する場合

int[] cnt = new int[5];
while(true) {
    // 中略
    cnt[no] = cnt[no] + 1;

    System.out.println(cnt[no] % 2 == 0 ? "△△△" : "〇〇〇");
}

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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/09/25 16:48

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

    キャンセル

  • 2020/09/25 16:52

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

    キャンセル

0

list.add(no);
int count = 0; //入力回数
for(int i : list) {
  if(i == no) {
    count++;
  }
}

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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