新規記事の投稿を行うことで、非表示にすることが可能です。
2022年05月17日
JAVA 多次元配列のイメージ
2次元以上の配列のことを多次元配列と呼ぶ。
2次元配列は、既に配列(※)されているものを、さらにまとめた(配列した)もの。
※配列:データをメモリ上に隙間をあけずに並べたもの
添字と値を確認するサンプルプログラム
public class MultidimensionalArrays{
public static void main(String[] args){
int[][] array = {{12,23,34}, {45,56,67}, {78,89,90}};
for (int i = 0; i < array.length; i++){
for (int j = 0; j < array[i].length; j++){
System.out.println("array[" + i + "][" + j + "] = " + array[i][j]);
}
}
}
}
2次元配列は、既に配列(※)されているものを、さらにまとめた(配列した)もの。
※配列:データをメモリ上に隙間をあけずに並べたもの
添字と値を確認するサンプルプログラム
public class MultidimensionalArrays{
public static void main(String[] args){
int[][] array = {{12,23,34}, {45,56,67}, {78,89,90}};
for (int i = 0; i < array.length; i++){
for (int j = 0; j < array[i].length; j++){
System.out.println("array[" + i + "][" + j + "] = " + array[i][j]);
}
}
}
}
2021年01月04日
JAVA equalsメソッド注意点
equalsメソッドを利用する際に比較対象の前後を気にしないで書いてしまうと、 NullPointerException が発生する可能性がある。
例外を避けるためには、Nullとならない比較対象の文字列を初め(先)に書いておく。
【Ex.】
A.equals(X) の場合
・Aがnullの場合は NullPointerException が発生する
・AがnullではなくXがnullの場合は false を返す
例外を避けるためには、Nullとならない比較対象の文字列を初め(先)に書いておく。
【Ex.】
A.equals(X) の場合
・Aがnullの場合は NullPointerException が発生する
・AがnullではなくXがnullの場合は false を返す
2019年01月25日
JAVA scannerクラスのnextInt()を利用した際、無限ループに陥ってしまう
scannerクラスのnextInt()を利用し、キーボードから数値を入力させる。
このとき、数値以外の文字が入力されると、プログラムの書き方によっては無限ループに陥ってしまう。
【Ex.】 数値を3つ入力させる。数値以外の文字が入力された場合は再度入力を促す。
public static void main(String[] args) {
int input[] = new int[3];
Scanner scan = new Scanner(System.in);
System.out.println("数字を入力してください");
for(int n = 0;n < 3;n++){
System.out.print((n + 1) + "個目 :");
try{
input[n] = scan.nextInt();
}
catch(InputMismatchException e){
System.out.println("数字を入力してください");
System.out.println("もう一度入力してください");
n--;
}
}
}
上記プログラムは、一見問題なく動くように見えるが、文字が入力されると無限ループに陥ってしまう。
これは、スキャナが InputMismatchException をスローすると、例外の原因となったトークンを読み飛ばさないため。
つまり、文字が入力され例外が発生した場合、
通常は(readLine()などでは)エラーになった文字は捨ててしまうが(読み飛ばしてしまうが)、
nextInt()はそれを読み飛ばさないため、永遠にエラー文字を読み取り続け無限ループに陥ってしまう。
この場合、オブジェクトを初期化し「前回のエラー文字を持っていない」新しいオブジェクトで呼び出すようにすることで解消される。
public static void main(String[] args) {
int input[] = new int[3];
System.out.println("数字を入力してください");
for(int n = 0;n < 3;n++){
System.out.print((n + 1) + "個目 :");
try{
Scanner scan = new Scanner(System.in);
input[n] = scan.nextInt();
}
catch(InputMismatchException e){
System.out.println("数字を入力してください");
System.out.println("もう一度入力してください");
n--;
}
}
}
このとき、数値以外の文字が入力されると、プログラムの書き方によっては無限ループに陥ってしまう。
【Ex.】 数値を3つ入力させる。数値以外の文字が入力された場合は再度入力を促す。
public static void main(String[] args) {
int input[] = new int[3];
Scanner scan = new Scanner(System.in);
System.out.println("数字を入力してください");
for(int n = 0;n < 3;n++){
System.out.print((n + 1) + "個目 :");
try{
input[n] = scan.nextInt();
}
catch(InputMismatchException e){
System.out.println("数字を入力してください");
System.out.println("もう一度入力してください");
n--;
}
}
}
上記プログラムは、一見問題なく動くように見えるが、文字が入力されると無限ループに陥ってしまう。
これは、スキャナが InputMismatchException をスローすると、例外の原因となったトークンを読み飛ばさないため。
つまり、文字が入力され例外が発生した場合、
通常は(readLine()などでは)エラーになった文字は捨ててしまうが(読み飛ばしてしまうが)、
nextInt()はそれを読み飛ばさないため、永遠にエラー文字を読み取り続け無限ループに陥ってしまう。
この場合、オブジェクトを初期化し「前回のエラー文字を持っていない」新しいオブジェクトで呼び出すようにすることで解消される。
public static void main(String[] args) {
int input[] = new int[3];
System.out.println("数字を入力してください");
for(int n = 0;n < 3;n++){
System.out.print((n + 1) + "個目 :");
try{
Scanner scan = new Scanner(System.in);
input[n] = scan.nextInt();
}
catch(InputMismatchException e){
System.out.println("数字を入力してください");
System.out.println("もう一度入力してください");
n--;
}
}
}
2019年01月18日
JAVA ループ内でリストの要素を削除する
forループ内で該当する値を削除する(removeする)と下記が発生する。
(リストを削除しつつlistの要素をgetしょうとすると下記が発生する。)
「java.util.ConcurrentModificationException」
この場合、for文ではなくwhile文を利用する。
【Ex.】 valueの要素値が2の場合、その要素を削除する。
public static void main(String[] args) {
int ransu = 99;
ArrayList<Integer> value = new ArrayList<Integer>();
while(0 != ransu){
ransu = (int)(Math.random()*11);
System.out.println("0〜10の値を出力:" + ransu);
value.add(ransu);
}
↑ まずは、0から10までの乱数を取得(※0が出たら乱数取得を終了)
■list.remove(Object o)メソッドを使う場合
while(value.remove((Integer)2)){}
■iterator(イテレータ)を使う場合
Iterator itr = value.iterator();
while(itr.hasNext()){
Integer i = (Integer)itr.next();
if(2 == i){
itr.remove();
}
※その他、後でまとめてremoveAllする方法でもよい。
(リストを削除しつつlistの要素をgetしょうとすると下記が発生する。)
「java.util.ConcurrentModificationException」
この場合、for文ではなくwhile文を利用する。
【Ex.】 valueの要素値が2の場合、その要素を削除する。
public static void main(String[] args) {
int ransu = 99;
ArrayList<
while(0 != ransu){
ransu = (int)(Math.random()*11);
System.out.println("0〜10の値を出力:" + ransu);
value.add(ransu);
}
↑ まずは、0から10までの乱数を取得(※0が出たら乱数取得を終了)
■list.remove(Object o)メソッドを使う場合
while(value.remove((Integer)2)){}
■iterator(イテレータ)を使う場合
Iterator itr = value.iterator();
while(itr.hasNext()){
Integer i = (Integer)itr.next();
if(2 == i){
itr.remove();
}
※その他、後でまとめてremoveAllする方法でもよい。