20220109のJavaに関する記事は11件です。

【Java文法】標準入出力

こんにちは、コイキングです。 本記事では'標準入出力(ユーザーからキーボード操作などにて入力を受け取り、コンソールにて結果を出力)'について、説明したいと思います。 1. 値を入力する(Scannerクラスを使う) Scannerクラスはユーザーからデータを入力してもらう様々なメソッドを提供するクラスです。 1) 整数データ入力 // (int) int inputInt = sc.nextInt(); System.out.println("Inputed int : "+inputInt); // (long) long inputLong = sc.nextLong(); System.out.println("Inputed long : "+inputLong); // (byte) byte inputByte = sc.nextByte(); System.out.println("Inputed byte : "+inputByte); // (short) short inputshort = sc.nextShort(); System.out.println("Inputed short : "+inputshort); 2) 文字データ入力 char inputChar = sc.next().charAt(0); System.out.println("Inputed char : "+inputChar); 3) 文字列データ入力 // 文字列が空白を基準にして入力してもらう。 String inputString = sc.next(); System.out.println("Inputed String next : "+inputString); // エンターキーを入力して貰うまでの全体文字列を入力してもらう。 String inputStringNextLine = sc.nextLine(); System.out.println("Inputed String nextLine : "+inputStringNextLine); 4) 浮動小数点数データ入力 // (float) float inputFloat = sc.nextFloat(); System.out.println("Inputed float : "+inputFloat); // (double) double inputDouble = sc.nextDouble(); System.out.println("Inputed double : "+inputDouble); 5) 論理データ入力 boolean inputBoolean = sc.nextBoolean(); System.out.println("Inputed boolean : "+inputBoolean); 2. 値を入力する(BufferedReaderクラスを使う) BufferedReaderクラスを使いデータを入力してもらうとScannerクラスを使ってデータを入力してもらうことより、速度が速くて入力してもらうデータが多ければ多く程効率が上がります。 しかし、データの入力は文字列として入力してもらうため、StringTokenizerクラスやStringクラスのsplit()メソッドを使って入力してもらう値を切り分ける処理をする必要があります。 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String inputedStringFromBR; StringTokenizer st = null; String [] strArray = null; try { inputedStringFromBR = br.readLine(); st = new StringTokenizer(inputedStringFromBR, " "); // 空白を区切りにして文字列を切り分ける strArray = new String[st.countTokens()]; for (int i=0; i<strArray.length; i++) { strArray[i] = st.nextToken(); } } catch (IOException e) { e.printStackTrace(); } for (String str : strArray) { System.out.println("BufferedReader inputed : "+str); } 3. 値を出力する。 1) 改行を含めて出力(System.out.println();) System.out.println("Hello World 1"); System.out.println("Hello World 2"); // 結果 // Hello World 1 // Hello World 2 2) 改行なしで出力(System.out.print();) System.out.print("Hello World 1"); System.out.print("Hello World 2"); // 結果 // Hello World 1Hello World 2 3) フォーマットを指定して出力(System.out.printf();, String.format();) // System.out.printf("フォーマット", 値1, 値2...); // 1) %d : 整数 System.out.printf("number 1 : %d %n", 100); System.out.printf("number 1 : %d , number 2 : %d %n", 100, 1500); // 2) %f : 浮動小数点数 System.out.printf("double 1 : %f %n", 0.15); System.out.printf("double 2 : %.3f %n", 2.123456); // 小数点 3桁まで出力 // 3) %c : 文字 System.out.printf("char : %c %n", 'a'); // 4) %s : 文字列 System.out.printf("String : %s-----%s %n", "Hello", "World"); // ※ String.format("フォーマット", 値1, 値2...) System.out.println(String.format("String : %s-----%s %n", "Hello", "World")); ※ 例示コード https://github.com/leeyoungseung/algorithmBasic/blob/master/algorithm/src/basic/B_09_IO.java ※ 韓国語のポストは以下のURLで確認できます。 https://koiking.tistory.com/81?category=1068655
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Java文法】メソッド

こんにちは、コイキングです。 本記事では'メソッド'について、説明したいと思います。 1. メソッドとは? メソッドは呼出すと特定の動作を行い、その結果をリターンするコードの集まりとして、数学の関数のような役割を担います。 2.メソッドの宣言 メソッド'[アクセス制御子] [リターンするデータ型] メソッド名(引数1, 引数2...){メソッドのコード... }'の様に宣言します。 1) 引数 X, 戻り値リターン X public void printHello() { System.out.println("Hello!!!"); } 括弧'()'の内部に引数を宣言せず、戻り値がないため、'[リターンするデータ型]'にはvoidを使います。 2) 引数 O, 戻り値リターン X public void printString(String str) { if (str == null || str.equals("")) { /* * こちらで使う returnは値をリターンせず、, * return以後のメソッド内部のコードが実行しないに解析。 * */ return; } System.out.println(str); } 括弧'()'の内部に引数を宣言し([データ型] [引数名])、戻り値がないため、'[リターンするデータ型]'にはvoidを使います。 3) 引数 X, 戻り値リターン O public int getRandomNumber() { return new Random().nextInt(100)+1; } 括弧'()'の内部に引数を宣言せず、'[リターンするデータ型]'に宣言したデータ型の値をreturnキーワードを使い、メソッドの戻り値をリターンします。 4) 引数 O, 戻り値リターン O public int getRandomNumberFromTo(int from, int to) { if (from <= 0 || to <= 0 ) { return 0; } return new Random().nextInt(to)+from; } 括弧'()'の内部に引数を宣言し([データ型] [引数名])、'[リターンするデータ型]'に宣言したデータ型の変数をreturnキーワードを使い、メソッドの戻り値をリターンします。 3. メソッドの呼出し 1) メンバーメソッド 'インスタンス.メソッド名()'でメソッドを呼出す事ができます。 ※ staticとして宣言しないメソッドはクラスのインスタンスを生成しなしと呼出す事ができません。 // 1) 引数 X, 戻り値リターン X method.printHello(); // 2) 引数 O, 戻り値リターン X method.printString("Bye Bye"); // 3) 3) 引数 X, 戻り値リターン O System.out.println(method.getRandomNumber()); int randomNum = method.getRandomNumber(); System.out.println(randomNum); // 4) 3) 引数 O, 戻り値リターン O System.out.println(method.getRandomNumberFromTo(5,10)); int randomNum2 = method.getRandomNumberFromTo(11,30); System.out.println(randomNum2); 2) 静的(static)メソッド 静的メソッドはインスタンスを生成しなくても呼出すことができるメソッドです。 'クラス名.メソッド名()'又は'インスタンス名.メソッド名()'で呼出すことができます。 // インスタンスを生成しなくても使える。 System.out.println(B_08_Method.getHelloWorld()); // 静的メソッド public static String getHelloWorld() { return "Hello World!!"; } ※ 例示コード https://github.com/leeyoungseung/algorithmBasic/blob/master/algorithm/src/basic/B_08_Method.java ※ 韓国語のポストは以下のURLで確認できます。 https://koiking.tistory.com/80?category=1068655
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Java文法】配列

こんにちは、コイキングです。 本記事では'配列'について、説明したいと思います。 1.配列とは? 配列は同じデータ型の変数が順次的に格納されているような形のデータ構造です。 数が決まっている同じデータ型のデータを扱う時に配列が使われます。 2.配列の宣言と初期化 1) 配列の宣言 // データ型 [] 配列名; int [] arrayInt; 2) 配列の初期化する(配列の長さを指定) // 配列名 = new データ型 [長さ]; arrayInt = new int[3]; 3) 配列の宣言と初期化を同時にする(配列の長さを指定) // データ型 [] 配列名 = new データ型 [長さ]; String [] arrayStr = new String[3]; 4) 配列の宣言と初期化を同時にし、配列にデータを入れて生成 - 方法1 // データ型 [] 配列名 = new データ型[]{要素1, 要素2, 要素3...} char [] arrayChar = new char[] {'A','B','C'}; - 方法2 // データ型 [] 配列名 = {要素1, 要素2, 要素3...} byte [] arrayByte = {1, 2, 3};​ 3. 配列に値を入力・出力する 配列の要素にアクセスするためにはインデクス(index)番号を知っておく必要があります。 配列のインデクス番号は0から初めて'配列名[インデクス番号]'のように配列の要素にアクセスできます。 System.out.println(arrayInt[0]); // 0 int配列の デフォルト値は0です。. System.out.println(arrayInt[1]); // 0 System.out.println(arrayInt[2]); // 0 // 配列の各空間に値を代入 arrayInt[0] = 3; arrayInt[1] = 2; arrayInt[2] = 1; // length配列の長さの値は入っている。 for (int i=0; i<arrayInt.length; i++) { System.out.println("配列の["+i+"] 番目インデクスの要素の値 : "+ arrayInt[i]); } 4. 多次元配列の宣言と初期化 多次元配列は"データ型 [][] 配列名 = new [上位次元の長さ][下位次元の長さ];"のように宣言と初期化ができます。 ※ 5 * 5の大きさの2次元配列は以下のような空間がメモリーに割当されます。 [0,0][0,1][0,2][0,3][0,4] [1,0][1,1][1,2][1,3][1,4] [2,0][2,1][2,2][2,3][2,4] [3,0][3,1][3,2][3,3][3,4] [4,0][4,1][4,2][4,3][4,4] 1) 宣言と配列の長さを指定する // データ型 [][] 配列名 = new [上位次元の長さ][下位次元の長さ]; int [][] MultiArrayInt1 = new int[5][5]; 2) 宣言と初期化を同時にする - 方法1 int [][] MultiArrayInt2 = new int[][] { {1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}, {11, 12, 13, 14, 15} }; - 方法2 int [][] MultiArrayInt3 = { {1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}, {11, 12, 13, 14, 15} }; 4. 多次元配列に値入力・出力する 多次元配列の要素にアクセスするためには'上位次元のインデクス番号'と'下位次元のインデクス番号'を知っておく必要があります。 '配列名[上位次元のインデクス番号][下位次元のインデクス番号]'のように配列の要素にアクセスできます。 System.out.println(MultiArrayInt1[0][0]); // 0 System.out.println(MultiArrayInt1[0][1]); // 0 System.out.println(MultiArrayInt1[0][2]); // 0 MultiArrayInt1[0][0] = 3; MultiArrayInt1[0][1] = 2; MultiArrayInt1[0][2] = 1; for (int i=0; i<MultiArrayInt1.length; i++) { for (int j=0; j<MultiArrayInt1.length; j++) { System.out.println("配列の ["+i+","+j+"] 番目 インデクスの要素の値 : "+ MultiArrayInt1[i][j]); } } ※ 例示コード https://github.com/leeyoungseung/algorithmBasic/blob/master/algorithm/src/basic/B_07_Array.java ※ 韓国語のポストは以下のURLで確認できます。 https://koiking.tistory.com/79?category=1068655
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Java文法】ループ

こんにちは、コイキングです。 本記事では'ループ(繰り返し処理)'について、説明したいと思います。 1. ループとは? ループは条件式の結果が偽になるまで、ループ構文内のコードを繰り返して実行する構文です。 Javaでループ構文はfor文、拡張for文(for-each文)、while文、do-while文があります。 2. for文 for文は決まった回数分コードを繰り返して実行したい時に主に使うループ文です。 // for ([初期値]; [条件式]; [増減演算]) { // 条件式の結果が偽になるまで実行するコード... // } for (int su1 = 0; su1 < 5; su1++) { System.out.println("for 1 ["+ su1 +"] 回目出力"); } 3. 拡張for文(for-each文) 拡張for文は配列やリストのようなデータを格納しているデータ構造から、格納されているデータを順次抜き出す場合、主に使います。 ArrayList<String> list = new ArrayList<String>(); list.add("String 1"); list.add("String 2"); list.add("String 3"); list.add("String 4"); // for ([データ型] [リストor 配列の要素] : [リストor 配列など..]) { // ..... // } for (String str : list) { System.out.println("for-each 1 " + str); } int [] array = new int[] {10, 11, 12, 13, 14}; for (int su : array) { System.out.println("for-each 2 " + su); } 4. while文 while文は最も簡単なループ文です。私の場合回数指定がない繰り返し処理が必要な場合使っています。 int su4 = 0; // while (条件式) { // 条件式の結果が偽になるまで実行するコード... // } while (su4 < 10) { su4++; System.out.println("while文 1 ["+ su4 +"] 番目出力"); } boolean flg = true; su4 = 0; while (flg) { su4++; System.out.println("while文 2 ["+ su4 +"] 番目出力"); if (su4 >= 5) { flg = false; System.out.println("while文 脱出~!"); } } 5. do-while文 do-while文は条件と関係なくwhile文内の内容を必ず1回は実行したい場合使います。 int su5 = 0; // 条件を満たさなくても1回はループ文内のコードが実行されます。 do { System.out.println("do-while文 1 ["+ su5 +"] 番目出力"); } while(su5 < -1); // 条件を満すと while文と同じ結果が出力されます。 do { su5++; System.out.println("do-while文 2 ["+ su5 +"] 番目出力"); } while(su5 < 5); 6. breakキーワード(ループ脱出) breakキーワードは条件式を満たすとbreakキーワードを囲んでいる最も近いfor文から脱出させるキーワードです。 // 1番目 for文 for (int i=0; i<5; i++) { System.out.println("for文 i ["+ i +"] 番目出力"); // 2番目 for文 for (int j=0; j<5; j++) { if (j == 3) { System.out.println("jの値が 3のため for文 j 脱出"); break; // 2番目 for文から脱出する } System.out.println("for文 j ["+ j +"] 番目出力"); } if (i == 4) { System.out.println("iの値が 4のため for文 i 脱出"); break; // 2番目 for文から脱出する } } 7. continueキーワード(繰り返しスキップ) continueキーワードは条件式を満たすとcontinueキーワード以後のループ文内部のコード実行をスキップし、continueキーワードを囲んでいる最も近い ループ文の最初に移動し、条件式の確認からループ文を再実行させる キーワードです。 int su6 = 0; while (su6 < 10) { su6++; if (su6 % 2 != 0) { continue; } System.out.println("while文 ["+ su6 +"] 番目出力"); } 8. labelキーワード ラベルはループ構文に名前を付けることで、breakやcontinueキーワードとともに使うと 多種ループ文から特定のループ文を指定して脱出したり、スキップする事ができます。 label_1 : for (int i=0; i<5; i++) { System.out.println("for文 i ["+ i +"] 番目出力"); label_2 : for (int j=0; j<5; j++) { if (j == 3) { System.out.println("jの値が 3のため for文 label_1 脱出"); break label_1; } } } ※ 例示コード https://github.com/leeyoungseung/algorithmBasic/blob/master/algorithm/src/basic/B_06_Loop.java ※ 韓国語のポストは以下のURLで確認できます。 https://koiking.tistory.com/78?category=1068655
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Java文法】条件分岐

こんにちは、コイキングです。 本記事では'条件分岐'について、説明したいと思います。 1. 条件分岐とは? 条件分岐は条件式を用いて、コードを実行するかどうか制御する構文で、 条件式の結果が真の場合構文内のコードが実行される形でコードの実行を制御します。 Javaで条件分岐の構文はif文、switch文、算術演算子があります。 2. if文 if文は条件式の結果が真であればif文の構文内のコードが実行され、プログラムのフローを制御する構文です。 else、else-ifキーワードを使ったり、省略することで多種多様にコード実行を制御できます。 1) if文単体で使う ※ 条件式の結果が真の場合、if文内部のコードが実行されます。 int a = 10; int b = 20; int c = 10; if (a < b) { System.out.println(a +" より "+ b +"が大きい"); } ※ 条件式の結果が偽の場合、if文内部のコードは実行されないです。 if (a < c) { System.out.println(a +" より"+ c +"が大きい"); } ※ AND・OR演算子を使い、複数の条件比較ができる if (a < b && a == c) { System.out.println(a +" より"+ c +"が大きい, " + a +"と "+ c +"は同じだ"); } 2) if - else if文の条件式の結果が真の場合、if文内部のコードが実行され、条件式の結果が偽の場合else文内部のコードが実行されます。 if (a < c) { System.out.println(a +" より"+ c +"が大きい"); } else { System.out.println("条件不一致!!"); } 3) if - else if if文の条件式の結果が真の場合、if文内部のコードが実行され、if文の条件の結果が偽の場合、 else if文の条件式を確認します。 else if文の条件式の結果が真の場合、else if文内部のコードが実行され、else if文の結果が偽の場合、if-else if構文のコードは何も実行されません。 ※ else if文の数は制限がありません。 if (a < c) { System.out.println(a +" より"+ c +"が大きい"); } else if (a < b && a == c) { System.out.println(a +" より"+ c +"が大きい, " + a +"と "+ c +"は同じ"); } else if (a < b) { System.out.println(a +" より"+ b +"が大きい"); } 4) if - else if - else if文の条件式の結果が真の場合、if文内部のコードが実行され、if文の条件の結果が偽の場合、 else if文の条件式を確認します。 else if文の条件式の結果が真の場合、else if文内部のコードが実行され、else if文の結果が偽の場合、else文内部のコードが実行されます。 if (a < c) { System.out.println(a +" より"+ c +"が大きい"); } else if (a < b && a == c) { System.out.println(a +" より"+ c +"が大きい, " + a +"と "+ c +"は同じ"); } else if (a < b) { System.out.println(a +" より"+ b +"が大きい"); } else { System.out.println("条件不一致!!"); } 3. switch文 switch文はキーの値と一致するケース文のコードを実行する方式でプログラムのフローを制御する構文です。 複数の条件分岐が必要な場合使うとif文よりコードが見やすくなると私は思います。 int key = 2; switch (key) { case 1 : System.out.println("Keyは 1 です。"); break; case 2 : System.out.println("Keyは 2 です。"); break; case 3 : System.out.println("Keyは 3 です。"); break; default: System.out.println("条件不一致!!"); break; } // # 実行結果 // Keyは 2 です。 ※ break文を使わない場合条件が一致したcaseからbreakを会うまで全てのcaseが実行されます! switch (key) { case 1 : System.out.println("Keyは 1 です。"); case 2 : System.out.println("Keyは 2 です。"); case 3 : System.out.println("Keyは 3 です。"); break; default: System.out.println("条件不一致!!"); } // # 実行結果 // Keyは 2 です。 // Keyは 3 です。 4. 三項演算子 三項演算子はif文を単体で使う場合に代わりに使うと、コードを見やすく作成できる長所がある条件分岐構文です。 ※ 基本的な使い方 int su1 = 100; int su2 = 200; // [データ型] [結果値を入れる変数] = (条件式) ? [条件式が真の場合の結果値] : [条件式が偽の場合の結果値]; int resultInt = su1 < su2 ? su1 : su2 ; System.out.println(resultInt); // 100 ※ 括弧で条件を囲むことができる、リターン可能なデータタイプはプリミティブ型・参照型どちらもできます。 String resultStr = (su1 < su2) ? su2+"の方がより大きい" : su1+"の方がより大きい" ; System.out.println(resultStr); // 200の方がより大きい ※ 結果値として戻り値があるメソッドをセットすることもできす。 int resultInt2 = (su1 < su2) ? beTwice(su2) : beTwice(su1); System.out.println(resultInt2); public static int beTwice(int su) { return su * 2; } ※ 例示コード https://github.com/leeyoungseung/algorithmBasic/blob/master/algorithm/src/basic/B_05_Conditions.java ※ 韓国語のポストは以下のURLで確認できます。 https://koiking.tistory.com/77?category=1068655
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Java文法】演算子(オペレーター)

こんにちは、コイキングです。 本記事では'演算子(オペレーター)'について、説明したいと思います。 1.演算子(オペレーター)とは? オペレーターは演算をする為の記号です。 主に使われている演算子は四則演算(しそくえんざん)のために必要な'算術演算子'、 値を順次増やしたり、減らしたりするための'増減演算子'、値の比較などための'比較演算子'、変数に値を代入するための'代入演算子'などがあります。 2. 算術演算子(さんじゅつえんざんし) 四則演算のような計算をするために使う演算子で、 コードでは"[値A][演算子][値B]"のような形で使われます。 コードの解析は"値Aを値Bで演算子に該当する演算を実施"とすれば良いです。 1) '+' プラス演算子 プラス演算子は足し算で使われ、コードの解析は "値Aに値Bを足す" になります。 int a = 100; int b = 20; int c = -10; System.out.println(a + b); // 120 System.out.println(a + c); // 90 2) '-'(ハイフン) マイナス演算子 マイナス演算子は引き算で使われ、コードの解析は "値Aから値Bを引く"になります。 System.out.println(a - b); // 80 System.out.println(a - c); // 110 3) '*'(アスタリスク) 掛け算演算子 アスタリスクは掛け算に使われ、コードの解析は "値Aに値Bを掛ける"になります。 System.out.println(a * b); // 2000 System.out.println(a * c); // -1000 4) '/'(スラッシュ) 割り算演算子 スラッシュは割り算に使われ、コードの解析は "値Aを値Bに割る"になります。 System.out.println(a / b); // 5 System.out.println(a / c); // -10 5) '%'(パーセント) 余り演算子 パーセントは割り算の余りを求める演算に使われ、コードの解析は "値Aを値Bに割った余りを求める"になります。 System.out.println(a % b); // 0 System.out.println(a % c); // 0 3. 増減演算子(ぞうげんえんざんし) 増減演算子は変数の値をインクリメント又はデクリメントする演算に使う演算子です。 増減演算子は前置又は後置で使えます。 1) '++n', '--n' 前置増減演算子 前置増減演算をする場合、増減演算を行った後、演算済みの値が出力されます。 int n = 0; System.out.println(++n); // 1 System.out.println(n); // 1 System.out.println(--n); // 0 System.out.println(n); // 0 2) 'n++', 'n--' 後置増減演算子 後置増減演算をする場合、変数に格納されていた値が予め出力し、増減演算が行われます。 System.out.println(n++); // 0 System.out.println(n); // 1 System.out.println(n--); // 1 System.out.println(n); // 0 4. 比較演算子 比較演算子は値を比較に使われる演算子です。比較演算の式が真か偽かの結果をbooleanの値にて返却します。 1) '<' 演算子 演算子を基準として 左側の値と右側の値を比較し、右側の値が大きくとtrueをリターンし、そうではない場合はfalseをリターンします。 int num1 = 10; int num2 = 20; int num3 = 10; System.out.println(num1 < num2); // true System.out.println(num1 < num3); // false 2) '<=' 演算子 演算子を基準として 左側の値と右側の値を比較し、'右側の値が大きい'又は'右側の値と左側の値が同じ場合'はtrueをリターンし、そうではない場合はfalseをリターンします。 System.out.println(num1 <= num2); // true System.out.println(num1 <= num3); // true 3) '>' 演算子 演算子を基準として 左側の値と右側の値を比較し、左側の値が大きくとtrueをリターンし、そうではない場合はfalseをリターンします。 System.out.println(num1 > num2); // false System.out.println(num1 > num3); // false 4) '>=' 演算子 演算子を基準として 左側の値と右側の値を比較し、'左側の値が大きい'又は'右側の値と左側の値が同じ場合'はtrueをリターンし、そうではない場合はfalseをリターンします。 System.out.println(num1 >= num2); // false System.out.println(num1 >= num3); // true 5) '==' 演算子 演算子を基準として 左側の値と右側の値を比較し、'右側の値と左側の値が同じ場合'はtrueをリターンし、そうではない場合はfalseをリターンします。 System.out.println(num1 == num2); // false System.out.println(num1 == num3); // true 6) '!='(XOR) 演算子 演算子を基準として 左側の値と右側の値を比較し、'右側の値と左側の値が違う場合'はtrueをリターンし、同じ場合はfalseをリターンします。 System.out.println(num1 != num2); // true System.out.println(num1 != num3); // false 7) '!'(NOT) 演算子 演算子を基準として 左側の値と右側の値を比較した結果がtrueの場合はfalseを、結果がfalseの場合はtrueをリターンします。 System.out.println(!(num1 == num2)); // true System.out.println(!(num1 == num3)); // false 8) '&&'(AND) 演算子 演算子を基準として 左側の式と右側の式の結果が全てtrueの場合はtrueを、両方の式のうちどちらでも式の結果がfalseの場合はfalseをリターンします。 ※ 左側の式の結果がfalseの場合、右側の式の比較は実行されない。 System.out.println((num1 != num2) && (num1 == num3)); // true System.out.println(isEqual(num1, num2) && isEqual(num1, num3)); // false public static boolean isEqual(int num1, int num2) { boolean result = num1 == num2; System.out.println("isEqual Result is : "+result); return result; } 9) '||'(OR) 演算子 演算子を基準として 左側の式と右側の式の結果が両方の式のうち、どちらか一つ以上の式の結果がtrueの場合はをtrueをリターンし、両方の式が全てfalseの場合falseをリターンします。 System.out.println((num1 != num2) || (num1 == num3)); // true System.out.println(isEqual(num1, num2) || isEqual(num1, num3)); // true ※ 論理演算の結果値まとめ 左式の結果 右式の結果 AND(&&) OR(||) XOR(!=) true true true true false true false false true true false false false true true false false false false false ※ 例示コード https://github.com/leeyoungseung/algorithmBasic/blob/master/algorithm/src/basic/B_04_Operator.java ※ 韓国語のポストは以下のURLで確認できます。 https://koiking.tistory.com/76?category=1068655
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Minioを用いてAWSアカウントなしでS3接続(javaSDK)を確認する方法

概要 この記事では、AWSのアカウントなしでもAWS S3 接続を確認できる方法を記事にしてみました。 Minio自体は、AWS S3 と互換性があるマルチクラウドオブジェクトストレージのOSSとして知られています。 現場の業務上 S3 に対してJavaを用いて接続する必要があり自宅で無料で接続確認がしたくてminioを採用しました。 使用方法をwebで調べたのですが、出てくるのはdockerを用いて簡単に構築することができることやMinioが提供しているライブラリを用いて接続する方法しかなく、AWS SDKで接続する方法が見つからなかったので今回挑戦し成功したので記事にしてみました。 minioって何?っていう方は以下の記事や公式のサイトを見ると理解できると思います。 https://min.io/ https://dev.classmethod.jp/articles/s3-compatible-storage-minio/ aws s3って何?という方は以下の記事や公式のサイトを見ると理解できると思います。 https://aws.amazon.com/jp/s3/ https://business.ntt-east.co.jp/content/cloudsolution/column-try-43.html 必要なもの dockerDesktop eclipse aws SDK jarファイル 方法 以下の記事より、dockerDesktopよりminioの環境を構築する https://dev.classmethod.jp/articles/s3-compatible-storage-minio/ 以下のサイトを参考にソースコードを作成しました。 https://docs.min.io/docs/how-to-use-aws-sdk-for-java-with-minio-server.html package minioS3; import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import com.amazonaws.AmazonClientException; import com.amazonaws.AmazonServiceException; import com.amazonaws.ClientConfiguration; import com.amazonaws.auth.AWSCredentials; import com.amazonaws.auth.AWSStaticCredentialsProvider; import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.client.builder.AwsClientBuilder; import com.amazonaws.regions.Regions; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.GetObjectRequest; import com.amazonaws.services.s3.model.PutObjectRequest; import com.amazonaws.services.s3.model.S3Object; public class Main { private static String bucketName = "testbucket"; private static String keyName = "hosts"; //指定したい自身のパソコン内のパスを記入する 今回はホストファイルを指定して簡易動作確認します。 private static String uploadFileName = "/etc/hosts"; public static void main(String[] args) throws IOException { //YOUR-ACCESSKEYID YOUR-SECRETACCESSKEYにminioに指定した値を入れる AWSCredentials credentials = new BasicAWSCredentials("YOUR-ACCESSKEYID", "YOUR-SECRETACCESSKEY"); ClientConfiguration clientConfiguration = new ClientConfiguration(); clientConfiguration.setSignerOverride("AWSS3V4SignerType"); //EndpointにMinioで指定した値を入れる リージョンの値はそのままで問題ないです。 AmazonS3 s3Client = AmazonS3ClientBuilder .standard() .withEndpointConfiguration( new AwsClientBuilder.EndpointConfiguration("http://localhost:9000", Regions.US_EAST_1.name())) .withPathStyleAccessEnabled(true) .withClientConfiguration(clientConfiguration) .withCredentials(new AWSStaticCredentialsProvider(credentials)) .build(); try { System.out.println("Uploading a new object to S3 from a file\n"); File file = new File(uploadFileName); // Upload file s3Client.putObject(new PutObjectRequest(bucketName, keyName, file)); // Download file GetObjectRequest rangeObjectRequest = new GetObjectRequest(bucketName, keyName); S3Object objectPortion = s3Client.getObject(rangeObjectRequest); System.out.println("Printing bytes retrieved:"); displayTextInputStream(objectPortion.getObjectContent()); } catch (AmazonServiceException ase) { System.out.println("Caught an AmazonServiceException, which " + "means your request made it " + "to Amazon S3, but was rejected with an error response" + " for some reason."); System.out.println("Error Message: " + ase.getMessage()); System.out.println("HTTP Status Code: " + ase.getStatusCode()); System.out.println("AWS Error Code: " + ase.getErrorCode()); System.out.println("Error Type: " + ase.getErrorType()); System.out.println("Request ID: " + ase.getRequestId()); } catch (AmazonClientException ace) { System.out.println("Caught an AmazonClientException, which " + "means the client encountered " + "an internal error while trying to " + "communicate with S3, " + "such as not being able to access the network."); System.out.println("Error Message: " + ace.getMessage()); } } private static void displayTextInputStream(InputStream input) throws IOException { // Read one text line at a time and display. BufferedReader reader = new BufferedReader(new InputStreamReader(input)); while (true) { String line = reader.readLine(); if (line == null) break; System.out.println(" " + line); } System.out.println(); } } まとめ awsは素晴らしいサービスですが、一歩間違うと大金を支払う可能性が出てくるので使うのが怖いですよね。 minioは他にも工夫すれば、スクレイピングの情報を溜めておくのに使えたりサイトのページとして使えるので応用を効かせると 夢が広がります。 今回、人生で初めてQiita投稿しました。 今後も、現場での知識や気になった技術などの投稿をしていきたいと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[java]戻り値を利用して台形の面積を求める

アウトプット用!! 5回目は 戻り値を利用して台形の面積を求めていく!! はじめに 戻り値とは何なのか?? 戻り値とは呼び出されたメソッドから、呼び出し元のメソッドへ値を返すことまたは値を戻すことを言います。 戻り値を使うことでより汎用性のあるメソッドを作れるようになります。 早速ですが、こちらがコードになります ensyu1.java //戻り値を利用して台形の面積を求める //台形の公式     面積 = {(上辺 + 下辺) *  高さ} /2 public class ensyu1 { public static void main(String[] args) { int area = daikei(5, 7, 4); System.out.println("台形の面積は" + area + "㎠です"); } public static int daikei(int topside, int bottomside, int height) { return ((topside + bottomside) * height) / 2; } } ①mainメソッドからdaikeiメソッドを呼び出す。 引数に(5,7,4)の値が入っていますが、これは上辺、下辺、高さです。 ②daikeiメソッドで計算する return areaの部分が戻り値で戻り値の値がdaikeiメソッドの呼び出し元であるmainメソッドに返される。 この場合、daikeiメソッドの左側の戻り値の型をintにする必要があります。なぜなら、returnで戻される型が整数だからです。もし文字列を戻す場合だとStringを指定する必要があります。 戻り値を使用しない場合のコード ensyu1.java //戻り値を利用して台形の面積を求める ////台形の公式     面積 = {(上辺 + 下辺) *  高さ} /2 public class ensyu2 { public static void main(String[] args) { daikei(); } public static void daikei() { int topside = 5; int bottomside = 7; int height = 4; int area = ((topside + bottomside) * 4) /2; System.out.println("台形の面積は" + area + "㎠です"); } }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

java ソースコードを github に上げるまで

java のソースコードを github に上げるまでの手順です。 ここでは「args_parser」というプロジェクト名とします。 1. github でリポジトリを作成 github でリポジトリを作成します。 ローカルに clone します。 $ git clone git@github.com:h-isota/args_parser.git 2. gradle で Java プログラムの雛形を生成 java ソースコードの雛形を作成します。 $ cd args_parser $ gradle init --type java-application 「app」というフォルダ内にソースコードが作成されるので、app フォルダから出します。 $ mv -i app/build.gradle app/src/ ./ $ rmdir app/ $ rm settings.gradle test が実行できることを確認します。 $ ./gradlew test 3. eclipse にインポート build.gradle の「plugins」に、id 'eclipse'を追加します。 build.gradle plugins { id 'application' id 'eclipse' } eclipse の設定ファイルを生成します。 $ ./gradlew eclipse eclipse を起動し、プロジェクトをインポートします。 パッケージ名を右クリック→「構成」→「Gradleネーチャーを追加」をクリックします。 メニューから「実行」→「JUnitテスト」でテストができることを確認します。 4. github にコミット コミットします。 $ git add . $ git commit -m "Set up Gradle, JUnit and Eclipse" $ git push 以上です。 ( 結果: https://github.com/h-isota/args_parser )
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Java - try-catch throwsを用いた例外処理について

Javaの例外処理を独自の例外クラスを作成して行う方法 なぜこの記事を書くことに至ったか 大学の課題でtry-catchを用いた例外処理のプログラムを書かないといけなくなったため 備忘録として残しておくため 本題 課題の内容は、Scannerインスタンスで入力された文字列が用意された配列(2つ)の中身と入力内容(2つ)が一 するかどうかというもの。 そして、try-catchを用いて独自の例外クラスを用いた処理を行うために、入力内容が何もない状態(改行)の時に例外処理を行うプログラムを作れ、というものでした。    まず先に例外処理クラスの作成を行います。 ExceptionCheck.java public class ExceptionCheck extends Exception{ // warningを回避するための宣言 private static final long serialVersionUID = 1L; ExceptionCheck(String msg) { // 継承元のExceptionのmessage(String型)にオーバーライドする super(msg); } } ここに継承元となるExceptionのapiリファレンスを貼っておきます https://docs.oracle.com/javase/jp/8/docs/api/index.html?java/lang/Exception.html  続いて、入力内容が配列と一致しているかを判定するcheckTrueメソッドを作成します。なおこのメソッドの返り値はboolean型となっています。 CheckTrue.java public class CheckTrue { private String[] names = {"Taro","Hanako"}; private String[] ids = { "abcd", "wxyz" }; public boolean checkTrue(String inputName, String inputId) throws ExceptionCheck { int i = 0, j = 0; // ここでTrueを返す組み合わせはnameとidの配列の要素が等しいモノどうしが正しい組み合わせとなる // 入力内容が何もない(改行された)状態になっていないか if (inputName.equals("")) { throw new ExceptionCheck("Input Name"); } else if (inputId.equals("")){ throw new ExceptionCheck("Input id"); }else{ for(String name:names){ if (name.equals(inputName)){ break; }else{ i++; } } for(String id:ids){ if (id.equals(inputId)){ break; }else{ j++; } } } if (i==j){ return true; }else{ return false; } } }  最後にメインプログラムを示します。 Main.java import java.util.Scanner; public class Main { public static void main(String[] args) { // インスタンスの作成 Scanner sc = new Scanner(System.in); CheckTrue checkTrue = new CheckTrue(); // 変数の宣言 boolean result = false; String name; String id; // 入力の催促 System.out.println("Input Name:"); name = sc.nextLine(); System.out.println("Input id:"); id = sc.nextLine(); // try-catch文 try { result = checkTrue.checkTrue(name, id); if (result) { System.out.println("True"); } else { System.out.println("False"); } } catch (ExceptionCheck e) { System.out.println(e); System.exit(0); } finally { // インスタンスを閉じる sc.close(); } } }  try-catch文の中では、CheckTrue.javaのcheckTrueメソッドに引数として渡した入力内容が、checkTrue内で処理・判定されてその結果がMain.java内のresultに格納されるような形となっています。  ただ、もしcheckTrueメソッドの中で入力内容に何もない状態があれば例外処理としてcatchされエラー情報が出力されてプログラムが終了します。  以下に実際にこのコードを動かしたものを例として示します。文字列や数字の横の<-はユーザーの入力を表すものとします # 正しい場合:1 $ java Main Input Name: Taro <- Input id: abcd <- True # 正しい場合:2 $ java Main Input Name: Hanako <- Input id: wxyz <- True # Nameが何もない(改行された)場合 $ java Main Input Name: <- Input id: wxyz ExceptionCheck: Input Name # idが何もない(改行された)場合 $ java Main Input Name: Hanako Input id: ExceptionCheck: Input id 以上のような出力結果となる。 ここまでを踏まえて CheckTrue.javaの、 public boolean checkTrue(String inputName, String inputId) throws ExceptionCheck のthrowsの解釈がはじめの方はまったく持って理解できなかったがここまでを踏まえて、自分なりの解釈をすると、「メソッドの中で起きためんどくさいことはあっち(ExceptionCheck)に投げやりにするよ!」というニュアンスに、 そしてcheckTrueメソッドの中の throw new ExceptionCheck("Input Name"); については、「ExceptionCheckに処理を投げつけるよ!」という風な意味合いがあるのだということを自分なりではあるが理解した。  あくまでも、ここまでを踏まえてからはぼく個人の感想なのでこの解釈が絶対的に正しいというわけではありません...
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

iOS APIでは RSA/ECB/OAEPwithSHA-256andMGF1Padding の暗号化・復号ができない

iOS の標準APIでは、Java の RSA-OAEP の "RSA/ECB/OAEPwithSHA-256andMGF1Padding" の暗号化・復号ができません。SHA-512も同様。 iOS API と Java の OAEP の違い OAEP は RSA で使われる平文パディングの手法で、アルゴリズムとしては2つのダイジェスト(ハッシュ)アルゴリズムを使います。 メッセージダイジェスト MGF(Mask Generation Function) ダイジェスト iOS の標準API と Java API では OAEP の仕様が微妙に違います。 Java の RSA/ECB/OAEPwithSHA-256andMGF1Padding: メッセージダイジェスト=SHA-256, MGF1ダイジェスト=SHA-1 iOS の SecurityAlgorithm.rsaEncryptionOAEPSHA256: メッセージダイジェスト=SHA-256, MGF1ダイジェスト=SHA-256 メッセージダイジェストは同じなのですが、MGF1ダイジェストが違うため、互換性がありません。 MGF1ダイジェストのほうは普通 SHA-1 で十分なはずなのですが、iOS ではなぜかメッセージダイジェストに合わせて変わってしまう様子。 このため、iOS 標準API では、Java の "RSA/ECB/OAEPwithSHA-256andMGF1Padding" に対応することは不可能です。 Java 側を iOS に合わせる Java 側では、メインダイジェストと MGF1 ダイジェストを個別に指定することができるので、iOS 側に合わせることができます。 Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPPadding"); cipher.init(Cipher.DECRYPT_MODE, privKey, new OAEPParameterSpec("SHA-256", "MGF1", MGF1ParameterSpec.SHA256, PSource.PSpecified.DEFAULT)); 自前で OAEP を実装する iOS 側では、OAEP Padding のみを実装し、あとは rsaEncryptionRaw で RSA 暗号化・復号を実行する、ということで MGF1 ダイジェストをあわせることができます。 OAEP の実装自体はそれほど難しくありません。OAEP を実装したものを RsaOaepPadding.swift として公開しています。 これを使うと、RSA/ECB/OAEPwithSHA-256andMGF1Padding 相当の暗号化は以下のように実装できます。 let plainData = "TEST TEXT".data(using: .utf8)! // main digest SHA256, MGF1 digest SHA1 で RsaOAEPPadding クラスを生成 let padding = RsaOAEPPadding(mainDigest: OAEPDigest.SHA256, mgf1Digest: OAEPDigest.SHA1) // OAEP Padding を計算 (RSA鍵長は 2048bit = 256byte前提) let padded = try! padding.pad(plain: plainData, blockSize: 256); // raw で暗号化 guard let cipherData = SecKeyCreateEncryptedData(publicKey, SecKeyAlgorithm.rsaEncryptionRaw, padded as CFData, &error) else { // Error処理 } 復号は以下のようになります。 guard let decryptedBlock = SecKeyCreateDecryptedData(privKey, SecKeyAlgorithm.rsaEncryptionRaw, cipherData as CFData, &error) else { // Error 処理 } // OAEP Padding 解除 let decrypted = try! padding.unpad(padded: decryptedBlock as Data) let decryptedString = String(data: decrypted, encoding: .utf8)! 検証用テストプログラム 検証用のプログラムおよびライブラリを https://github.com/tmurakam/rsa-oaep においておきます。 Apple に言いたいこと SecKeyAlgorithm の説明、不足しすぎじゃね?
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む