配列の問題


問題1

【やりたいこと】:配列の内容を出力したい。

【エラーが起きます】:下記のコードで実行するとエラーが起きます。どこが間違っており,どのように修正すればよいでしょう?

【ファイル名】:ArrayQuestion001.java

public class ArrayQuestion001 {
    public static void main(String[] args){
        int array[] = { 1, 2, 3 };
        for (int i = 1; i <= 3; i++) {
            System.out.println(array[i]);
        }
    }
}

【解決方法】
for文の初期値と,条件を変更します。

public class ArrayQuestion001 {
    public static void main(String[] args){
        int array[] = { 1, 2, 3 };
            for (int i = 0; i < 3; i++) {//配列の添え字は0からスタートしてカウントをするため
            System.out.println(array[i]);
        }
    }
}

【解説】
4行目のfor文での指定箇所にエラーがあります。配列の要素は0からカウントしていきますので,
今回の場合は,要素へのアクセスは,0, 1, 2までしかありません。
配列外の部分にアクセスしようとすると,エラーが起きますので,注意が必要です。
その場合エラーメッセージは,「java.lang.ArrayIndexOutOfBoundsException」が実行時エラーとして出力されるので,
上記メッセージが出た場合は,要素へのアクセスが正しい範囲かを確認して修正しましょう。

【スッキリわかるJava入門編第2版の参考ページ】140-141ページ


問題2

【やりたいこと】:配列の内容を出力したい。

【エラーがでている】:下記のコードでエラーがあります。どこが間違っており,どのように修正すればよいでしょう?

【ファイル名】:ArrayQuestion002.java

public class ArrayQuestion002 {
    public static void main(String[] args){
        int array[] = new int[3];
        array[0] = 30;
        array[1] = "50";
        array[2] = 80;
        for (int i = 0; i < 3; i++) {
            System.out.println(array[i]);
        }
    }
}

【解決方法】
int型の配列にString型の文字列を入れているので,整数値へ変更する。

public class ArrayQuestion002 {
    public static void main(String[] args){
        
        int array[] = new int[3];
        array[0] = 30;
        array[1] = 50;//整数値に変更します。
        array[2] = 80;

        for (int i = 0; i < 3; i++) {
            System.out.println(array[i]);
        }
    }
}

【解説】
6行目の"50"の部分で,赤波線が入っており,Eclipseの場合,左側に×印が表示され,そちらにマウスをあわせると
「型の不一致: String から int には変換できません」といったメッセージを確認できると思います。
配列の場合,宣言されている型以外のものは代入できないので,型にあわせて値を代入しましょう。

【スッキリわかるJava入門編第2版の参考ページ】140-141, 148-149ページ


問題3

【やりたいこと】:配列のサイズを出力したい。

【問題】:上記を実現するためには,どのようなコードにすればよいでしょう?

【ヒント】:配列を初期化した際の数字をそのままいれるのではなく。。。

【ファイル名】:ArrayQuestion003.java

public class ArrayQuestion003 {
    public static void main(String[] args){
        int array[] = new int[3];

        System.out.println("配列arrayの要素の数は,");//要素数を出力するプログラムを追記しましょう。
    }
}

【解決方法】
配列の要素数を取得するlengthを利用します。

public class ArrayQuestion003 {
    public static void main(String[] args){
        int array[] = new int[3];

        System.out.println("配列arrayの要素の数は," + array.length);//要素数を出力するプログラムを追記しましょう。
    }
}

【解説】
配列の要素数を求める場合,[配列の変数名]に.lengthを追加することで,取得できます。
あらかじめ決められた要素数の場合は直接記述でもよいかと思いますが,lengthを利用したほうが安全です。

【スッキリわかるJava入門編第2版の参考ページ】142-145ページ


問題4

【問題】:下記のプログラムを実行すると,何が出力されるでしょうか?

【ファイル名】:ArrayQuestion004.java
public class ArrayQuestion004 {
    public static void main(String[] args){
        String array[] = new String[3];

        for (int i = 0; i < array.length; i++) {
            System.out.println(array[i]);
        }
    }
}

【出力】
下記のようになります。

null
null
null

【解説】
String型の配列の場合,初期化しない時要素は,nullで初期化されます。intやdoubleなどの配列の要素については,0で初期化され,
boolean型の場合は,falseになります。初期化せずに利用すると誤りが起きやすいかと思いますので,初期化はしっかりとしましょう。

【スッキリわかるJava入門編第2版の参考ページ】146-147ページ


問題5

【やりたいこと】:arrayの要素の合計と平均を出力したい。

【問題】:上記を実現するためには,どのようなコードにすればよいでしょう?

【ファイル名】:ArrayQuestion005.java
public class ArrayQuestion005 {
    public static void main(String[] args){
        int array[] = {68, 85, 92, 77, 72, 100, 55};

        //forを上手く利用して計算しましょう。

        System.out.println("合計は,"); //合計を出力しましょう。
        System.out.println("平均は,"); //平均を出力しましょう。
    }
}

【解決方法】
下記のようなコードになります。

public class ArrayQuestion005 {
    public static void main(String[] args){
        int array[] = { 68, 85, 92, 77, 72, 100, 55 };

        int sum = 0;//①合計をいれておく変数を用意します。
        for (int i = 0; i < array.length; i++) {//②配列の要素文の繰り返し処理をします。
            sum = sum + array[i];//③合計するために,要素の値を追加していきます。
        }
        int avg = sum / array.length;//④平均は,合計÷要素数で求めます。

        System.out.println("合計は," + sum); //合計を出力しましょう。
        System.out.println("平均は," + avg); //平均を出力しましょう。
    }
}

【解説】
合計値の変数を用意しておき,配列の要素数文の繰り返しの処理をforで記述します。
繰り返しの処理の中で配列の要素の値をsumに加算していき,合計を求め,平均は,合計÷要素数で求めて,出力をします。
要素の数が少ない場合は直接記述も可能ですが,スマートな方法を覚えておきましょう。
ちなみに,合計は,549となり,平均は,78と出力されます。平均はintの変数に入れているため,割り算後,小数以下は切り捨てられています。

【スッキリわかるJava入門編第2版の参考ページ】148-152ページ


問題6

【問題】:下記のプログラムを実行すると,実行時エラーがでます。何が原因でしょう?

【ファイル名】:ArrayQuestion006.java

public class ArrayQuestion006 {
    public static void main(String[] args){
        int array[] = { 68, 85, 92, 77, 72, 100, 55 };
        array = null;
        array[0] = 50;
        System.out.println("array[0]は" + array[0]);
    }
}

【解説】
Eclipse上で確認すると5行目で警告がでているかと思います。4行目で配列をnullとしているため,
参照先がなくなっており,5行目で代入が出来なくなっている状態になっていることが原因で,
実行すると「java.lang.NullPointerException」となり,5行目でエラーとなってしまうことがわかります。
配列の参照を削除する場合は,null を代入してメモリを開放してよいのですが,利用する場合は気をつけましょう。

【スッキリわかるJava入門編第2版の参考ページ】157-160ページ


問題7

【やりたいこと】:入力された文字列が配列arrayに含まれるかどうかを判定するプログラムを作成したい。

【問題】:上記を実現するためには,どのようなコードにすればよいでしょう?

【ファイル名】:ArrayQuestion007.java

public class ArrayQuestion007 {
    public static void main(String[] args){
        String array[] = { "りんご", "みかん", "ぶどう" };

        System.out.println("文字を入力してください。");//入力を促すメッセージです。
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();
        System.out.println("入力された文字列は, " + input);//入力された文字列の値を出力します。
        //この下にプログラムを記載します。
        
        
        
        
        System.out.println("配列に含まれています。");//配列arrayに含まれている場合のメッセージ。
        System.out.println("配列に含まれていません。");//配列arrayに含まれていない場合のメッセージ。
        

        sc.close();//※Scannerを利用した場合,入力の受付をもうしないという場合,close処理が必要です。
    }
}

【解決方法】
下記のようなコードになります。

public class ArrayQuestion007 {
    public static void main(String[] args){
        String array[] = { "りんご", "みかん", "ぶどう" };

        System.out.println("文字を入力してください。");//入力を促すメッセージです。
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();
        System.out.println("入力された文字列は, " + input);//入力された文字列の値を出力します。
        //この下にプログラムを記載します。

        boolean checkFlag = false;//①チェック用のフラグを用意します。
        for (int i = 0; i < array.length; i++) {//②配列の要素を確認するためのループ処理を書きます。
            if (array[i].equals(input)) {//③入力文字列と配列の要素が一致するかを判定します。
                checkFlag = true;//④一致している場合,チェックフラグをtrueにします。
                break;//⑤配列の要素に含まれていることがわかったので,ループ処理を終了させます。
            }
        }

        if (checkFlag) {//⑥入力されている文字列が含まれているかの条件を判定をしています。
            System.out.println("配列に含まれています。");//配列arrayに含まれている場合のメッセージ。
        } else {
            System.out.println("配列に含まれていません。");//配列arrayに含まれていない場合のメッセージ。
        }

        sc.close();//※Scannerを利用した場合,入力の受付をもうしないという場合,close処理が必要です。
    }
}

【解説】
今回の問題は複合問題となっています。Scannerでの入力の確認や,if-elseやfor, 配列を利用しているため,ちょっと難しいかもしれません。
考えることとしては,判定するためには,どうすればよいかを考えることが大切となり,
配列の中身を確認するためにforループが必要なことや,入力文字列と配列の要素が一致しているかの条件判定,
配列が含まれていたかどうかを保存しておく変数が必要なことに気づかなければなりません。
このようなプログラムはよくある形ですので,覚えてよいパターンだと思います。

【スッキリわかるJava入門編第2版の参考ページ】???ページ 複合問題で,Scanner, if-else, for, 配列の章を確認しましょう。


問題8

【やりたいこと】:int型配列array内の最大値と最小値を出力するプログラムを作成したい。

【問題】:上記を実現するためには,どのようなコードにすればよいでしょう?

【ファイル名】:ArrayQuestion008.java

public class ArrayQuestion008 {
    public static void main(String[] args){
        int array[] = { 38, 79, 54, 92, 55, 18 };

        //この下に最大値と最小値を取得するためのプログラムを書きましょう。

        System.out.println("最大値は,");//最大値を出力
        System.out.println("最小値は,");//最小値を出力
    }
}

【解決方法】
下記のようなコードになります。

public class ArrayQuestion008 {
    public static void main(String[] args){
        int array[] = { 38, 79, 54, 92, 55, 18 };

        int max = array[0];//最初の要素を設定しておく。
        int min = array[0];//最初の要素を設定しておく。

        for(int i = 1; i < array.length; i++){//要素の二つ目から判定を始める。
            if(max < array[i]){//現在の最大値よりも要素が大きい場合
                max = array[i];
            }

            if(min > array[i]){//現在の最小値よりも要素が小さい場合
                min = array[i];
            }
        }


        System.out.println("最大値は," + max);//最大値を出力
        System.out.println("最小値は," + min);//最小値を出力
    }
}

【解説】
今回の問題も複合問題となっています。
配列内で最大値や最小値を判定するには要素をそれぞれ判定していかないといけません。
配列の中身を確認するためにforループをしながら,最大値と最小値を格納しておく変数と比較をして確認していきます。
最後にそれぞれの値を出力をして完了です。
このようなプログラムもよくある形ですので,覚えてよいパターンだと思います。

【スッキリわかるJava入門編第2版の参考ページ】???ページ 複合問題で,if-else, for, 配列の章を確認しましょう。


問題9

【やりたいこと】:String型配列arrayに整数値文字列を1から100まで代入して,arrayを用いて出力をしたい。

【問題】:上記を実現するためには,どのようなコードにすればよいでしょう?

【ヒント】:文字列を整数値intへ変換する方法は,Integer.parseIntを用いますが,整数値を文字列型に変換する方法は?

【ファイル名】:ArrayQuestion009.java

public class ArrayQuestion009 {
    public static void main(String[] args){
        String array[];//
        
        //①arrayに整数文字列を1から100までを代入しながら初期化しましょう。
        
        
        //②arrayを用いて出力しましょう。
    }
}

【解決方法】
下記のようなコードになります。

public class ArrayQuestion009 {
    public static void main(String[] args){
        String array[] = new String[100];//①配列の要素を100個入れられるようにします。

        //②ループ処理を用いて整数int を文字列型Stringに変換しながら代入を行います。
        for (int i = 0; i < array.length; i++) {
            array[i] = String.valueOf(i + 1);
        }

        //③arrayを用いて出力しましょう。
        for (int i = 0; i < array.length; i++) {
            System.out.println(array[i]);
        }

        //※拡張for文で出力する場合は,下記のようになります。
        for (String num : array) {
            System.out.println(num);
        }
    }
}

【解説】
今回のポイントはループ処理をしながら,整数値を文字列型へ変換しながら,配列を初期化しているところになります。
7行目の処理で,右辺の処理は,ループ変数のiを利用しながら,1から100を作成しています。
右辺のString.valueOfというメソッドは,数値型をString型へ型を変換してくれるメソッドとなります。
1回目のループでは,array[0] = String.valueOf(0 + 1); つまり,array[0] = "1";という形になります。
これを100回繰り返し,順番に初期化をします。手作業でも可能なことですが,スマートな方法を身につけましょう。

【スッキリわかるJava入門編第2版の参考ページ】???ページ 複合問題で,for, 配列の章を確認しましょう。


問題10

【やりたいこと】:配列の内容を出力したい。

【エラーが起きます】:下記のコードにはエラーがあります。どこが間違っており,どのように修正すればよいでしょう?

【ファイル名】:ArrayQuestion010.java

public class ArrayQuestion010 {
    public static void main(String[] args){
        int array[] = { 30, 70, 40, 50 };

        for (int i = 0; i < array.length; i++) {
            System.out.println(array(i));
        }
    }
}

【解決方法】
配列の要素については[]を用います。

public class ArrayQuestion010 {
    public static void main(String[] args){
        int array[] = { 30, 70, 40, 50 };

        for (int i = 0; i < array.length; i++) {
            System.out.println(array[i]);//array(i)ではなく,array[i]に変更します。
        }
    }
}

【解説】
4行目のarrayの箇所で赤波線が入っており,Eclipseの場合,左側に×印が表示され,そちらにマウスをあわせると
「メソッド array(int) は型 ArrayQuestion010 で未定義です」といったメッセージを確認できると思います。
配列の要素を指定する場合のカッコは,[] を利用するので,そちらに修正します。

【スッキリわかるJava入門編第2版の参考ページ】145-147ページ


問題11

【やりたいこと】:配列arrayの要素を時計回りに90度回転させて,array2へ代入してその内容を出力したい。

【問題】:上記を実現するプログラムはどのようにすればよいでしょうか?

【ファイル名】:ArrayQuestion011.java

public class ArrayQuestion011 {
    public static void main(String[] args){
        int array[][] = { { 1, 2, 3 },
                          { 4, 5, 6 },
                          { 7, 8, 9 } };

        //変換前の出力
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[0].length; j++) {
                System.out.print(array[i][j] + " ");
            }
            System.out.println();
        }

        //時計回りに90度,要素を回転するプログラムを書く。
        int array2[][] = new int[array[0].length][array.length];

        //変換後の出力
        for (int i = 0; i < array2.length; i++) {
            for (int j = 0; j < array2[0].length; j++) {
                System.out.print(array2[i][j] + " ");
            }
            System.out.println();
        }
    }
}

【実行結果のサンプル】下記のように出力しましょう。

1 2 3 
4 5 6 
7 8 9 
7 4 1 
8 5 2 
9 6 3 

【解決方法】
下記のようにします。

public class ArrayQuestion011 {
    public static void main(String[] args){
        int array[][] = { { 1, 2, 3 },
                          { 4, 5, 6 },
                          { 7, 8, 9 } };

        //変換前の出力
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[0].length; j++) {
                System.out.print(array[i][j] + " ");
            }
            System.out.println();
        }

        //時計回りに90度,要素を回転するプログラムを書く。
        int array2[][] = new int[array[0].length][array.length];
        for (int i = 0; i < array.length; i++) {
            for (int j = 0; j < array[0].length; j++) {
                array2[j][array.length - 1 - i] = array[i][j];
            }
        }

        //変換後の出力
        for (int i = 0; i < array2.length; i++) {
            for (int j = 0; j < array2[0].length; j++) {
                System.out.print(array2[i][j] + " ");
            }
            System.out.println();
        }
    }
}

【解説】
配列の要素をそれぞれ時計回りに90度回転させるためにはどうすればよいか?をイメージします。
このとき,配列arrayの値を一つずつ取得するループをまず考えて,その後に,それをどのようにすれば,配列に入れられるか?を考えます。
まずイメージする部分としては,arrayの1,2,3をarray2に時計回りに設定するとき,要素がどのような動きをするかを考えるとよいと思います。
1についてはarray[0][2]に,2についてはarray[1][2]に,3についてはarray[2][2]になると考えると,法則がみえてくるかと思います。
その法則をみつけてプログラムをするということが大事になります。

【スッキリわかるJava入門編第2版の参考ページ】161-163ページ


問題12

【やりたいこと】:乱数を利用して,一つだけ配列の要素の内容を出力したい。

【エラーが起きます】:下記のコードには問題があります。どこが間違っており,どのように修正すればよいでしょう?

【ファイル名】:ArrayQuestion012.java

public class ArrayQuestion012 {
    public static void main(String[] args){
        String array[] = { "りんご", "みかん", "ぶどう" };

        Random rand = new Random();
        int index = rand.nextInt(4);

        System.out.println("ランダムで得られた配列の要素は" + array[index]);
    }
}

【解決方法】
nextIntのメソッドの引数を3に変更します。

public class ArrayQuestion012 {
    public static void main(String[] args){
        String array[] = { "りんご", "みかん", "ぶどう" };

        Random rand = new Random();
        int index = rand.nextInt(3);//3にすると,乱数は,0, 1, 2 となり,配列の要素の範囲に入ります。

        System.out.println("ランダムで得られた配列の要素は" + array[index]);
    }
}

【解説】
配列の要素は0からスタートするため,今回の場合の要素は,0, 1, 2以外の場合,配列外参照のエラーがでてしまいます。
RandomクラスのnextIntのメソッドは引数に設定されている数字(n)の一つ少ない数で,0~n-1を取得するため,
配列の要素の範囲におさめる為に数値を変更します。

【スッキリわかるJava入門編第2版の参考ページ】89-90, 148-149ページ


問題13

【やりたいこと】:配列をソート(きれいに並び替える)したい。

【問題】:下記のコードの配列を並び替えるにはどうしたらよいでしょう。

【ヒント】:配列をソートしてくれるメソッドがありますので,「java 配列 ソート」などで調べて実装してみましょう。

【ファイル名】:ArrayQuestion013.java

public class ArrayQuestion013 {
    public static void main(String[] args){
        int array[] = { 3, 5, 1, 7, 4, 2, 6 };

        //配列をソートできるメソッドを探しましょう。
        //こちらにメソッドを記述しましょう。

        System.out.println("ソート後の出力");
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }
    }
}

【解決方法】
Arrays.sortを利用します。

import java.util.Arrays;

public class ArrayQuestion013 {
    public static void main(String[] args) {
        int array[] = { 3, 5, 1, 7, 4, 2, 6 };

        //配列をソートできるメソッドを探しましょう。
        Arrays.sort(array);

        System.out.println("ソート後の出力");
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }
    }
}

【解説】
配列をソートする場合,Arrays.sortを利用します。その際,import java.util.Arrays;のインポートが必要になりますので,
忘れないように追加をしましょう。プログラムを書く際に,やりたいことを実現するときに,すでにメソッドなどがないか?を
調べると,新たな発見などにもつながりますので,調べる力も一緒に鍛えていきましょう。

【スッキリわかるJava入門編第2版の参考ページ】???ページ


問題14

【やりたいこと】:配列をシャッフルしたい。

【問題】:下記のコードの配列をシャッフルするにはどうしたらよいでしょう。

【ヒント】:Randomクラスの乱数を利用して,20回要素を入れ替える処理を記述しましょう。

【ファイル名】:ArrayQuestion014.java

import java.util.Random;

public class ArrayQuestion014 {
    public static void main(String[] args) {
        //配列を1~10の数値で初期化します。
        int array[] = new int[10];
        for (int i = 0; i < array.length; i++) {
            array[i] = i + 1;
        }

        //Randomクラスを利用して,配列の要素を入れ替えてシャッフルを作成しましょう。
        Random rand = new Random();
        for (int i = 0; i < 20; i++) {
            //ここに処理を書きましょう。
        }

        //配列を出力。
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }

    }
}

【解決方法】
乱数を取得するnextIntメソッドを利用して,ランダムに添え字の値を取得して,入れ替えを行います。

import java.util.Random;

public class ArrayQuestion014 {
    public static void main(String[] args) {
        //配列を1~10の数値で初期化します。
        int array[] = new int[10];
        for (int i = 0; i < array.length; i++) {
            array[i] = i + 1;
        }

        //Randomクラスを利用して,配列の要素を入れ替えてシャッフルを作成しましょう。
        Random rand = new Random();
        for (int i = 0; i < 20; i++) {
            int index1 = rand.nextInt(array.length);
            int index2 = rand.nextInt(array.length);
            int temp = array[index1];
            array[index1] = array[index2];
            array[index2] = temp;
        }

        //配列を出力。
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }

    }
}

【解説】
配列をシャッフルする場合,要素の添え字部分を入れ替える必要があるので,要素までの乱数をnextIntメソッドで2つ取得します。
値を入れ替える場合,もう一つ変数が必要なので,tempを用意しました。
今回は20回の繰り返し処理の中で,入れ替え処理をしていますが,要素数が増えた場合は,変更しましょう。
プログラムを作る際には,色々なものを組み合わせることが多くなってきますので,少しずつ知識を身につけていきましょう。

【スッキリわかるJava入門編第2版の参考ページ】???ページ