【Java】Scanner・三項演算子・配列操作 (AOJ①大小整列)


<br>AIZU ONLINE JUDGE の教材を使って勉強していきます


#AIZU ONLINE JUDGE とは
* AOJ（Aizu Online Judge：onlinejudge.u-aizu.ac.jp）は誰でも無料で利用できるプログラミング問題のオンライン採点システムです
* http://judge.u-aizu.ac.jp/onlinejudge/
* 開発者の渡部有隆さんによる機能・使いかた解説<br>
https://book.mynavi.jp/manatee/series/detail/id=88273
* JavadではClass名をMainにしないと通らないので注意

>オンラインジャッジとは、多くの演習問題にチャレンジすることができ、オンラインでコードを採点してくれるサービスです。各問題には、テストデータが準備されており、提出されたコードの正誤とその効率の判定を即座に行ってくれます

#入力を受け取る方法（Scanner）
* **nextLineメソッド**：改行までの1行分の入力を取得
    * 単語間のスペースを含む入力を読み取ります（\n行の終わりまで）
    * 入力が読み込まれると、カーソルを次の行に移動
* **nextメソッド**：スペースまで入力を読み込む
    * 入力を読んだ後にカーソルを同じ行に置く
* * **nextIntメソッド**：スペースまでの入力をintとして取得
    * エスケープシーケンス"\n"は読み取らない

```java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws Exception {
        Scanner scan = new Scanner(System.in);
        // String str = scan.nextLine();
        // System.out.println(str); //neko inu
        String str1 = scan.next(); 
        String str2 = scan.next(); 
        System.out.println(str1); //neko
        System.out.println(str2); //inu
        
        scan.close();
    }
}
```

##長方形の面積と周の長さ
> たて a cm よこ b cm の長方形の面積と周の長さを求めるプログラムを作成して下さい。

```java
import java.util.Scanner;
public class Main {
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        int a = scan.nextInt();
        int b = scan.nextInt();
        System.out.println( (a*b) + " " + (a*2+b*2) );
	//System.out.printf("%d %d\n",a*b,2*(a+b));
    }
}
```

##時計
> 秒単位の時間Sが与えられるので h: m :s の形式へ変換して出力してください。ここで、hは時間、mは60未満の分、sは60未満の秒とします。H、m、sを :（コロン）区切りで１行に出力してください。

```java
import java.util.Scanner;
public class Main {
    public static void main(String[] args){
	Scanner sc = new Scanner(System.in);
        int sec, min, hour;
        sec = sc.nextInt();
        hour = sec / 3600;
        min = (sec%3600) / 60;
        sec = sec % 60;
        System.out.println(hour+":"+min+":"+sec);
    }
}
```

#条件演算子（三項演算子）
* `(条件式) ? 式A : 式B`
* 条件式の値がtrueだった場合に式1を処理、falseだった場合に式2を処理
* AとBを比較するとき(式A：式B) 式A、Bは何らかの値を返す必要がある


```java
public class Main {
    public static void main(String[] args) throws Exception{
    var age = 20;
    System.out.println(age >= 20 ? "大人" : "子供"); //大人
    }
}
```
* 参考
 [【Java】演算子のまとめ（オペレーター）](https://qiita.com/suema0331/items/7045e3ce3e2f5faa9acf#%E9%96%A2%E4%BF%82%E6%BC%94%E7%AE%97%E5%AD%90%E6%AF%94%E8%BC%83%E6%BC%94%E7%AE%97%E5%AD%90)

##大小関係
>２つの整数 a, b を読み込んで、a と b の大小関係を出力するプログラムを作成して下さい。

```java
import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();
        String result = (a == b) ? "a == b" : (a > b) ? "a > b" : "a < b";
        System.out.println(result);
    }
}
```

#配列操作
* **Arraysクラス**
* 配列は後からサイズ変更できない
* →**copyOfメソッド**でサイズの異なる配列に値を複製
* copyOf、copyOfRangeは**シャローコピー**
* シャローコピーは参照型の場合、コピー元が変わるとコピー先も変わってしまう
* →**ディープコピー**
* `var list2 = new StringBuilder[list1.length];`

```Java
//Shallow copy
import java.util.Arrays;

public class Main {
  public static void main(String[] args) {
    var  array1 = new String[] { "dog", "cat", "mouse", "fox", "lion" };
    //配列をソート
    Arrays.sort(array1);
    //配列を文字列化
    System.out.println(Arrays.toString(array1)); //[cat, dog, fox, lion, mouse]
    //ソート済の配列から値を検索
    System.out.println(Arrays.binarySearch(array1, "mouse")); //4

    var array2 = new String[] { "あ", "い", "う", "え", "お" };   
    //配列コピー、引数に長さ、不足分は0/nullで埋める
    var array3 = Arrays.copyOf(array2, 2);
    System.out.println(Arrays.toString(array3)); //[あ, い]

    //配列を引数で範囲指定してコピー
    var array4 = Arrays.copyOfRange(array2, 1, 7);
    System.out.println(Arrays.toString(array4)); //[い, う, え, お, null, null]

    //配列に値を設定
    Arrays.fill(array4, 4, 6, "―");
    System.out.println(Arrays.toString(array4)); //[い, う, え, お, ―, ―]
  }
}
```
```Java
//Deep copy
import java.util.Arrays;

public class Main {
  public static void main(String[] args) {
    var list1 = new StringBuilder[] {
        new StringBuilder("ドレミファドーナツ"),
        new StringBuilder("ARAMA"),
        new StringBuilder("ハニホヘト")
      };

    var list2 = new StringBuilder[list1.length];
    for (var i = 0; i < list1.length; i++) {
      list2[i] = new StringBuilder(list1[i].toString());
    }

    list1[2].append("ハロー");
    System.out.println(Arrays.toString(list1)); //[ドレミファドーナツ, ARAMA, ハニホヘトハロー]
    System.out.println(Arrays.toString(list2)); //[ドレミファドーナツ, ARAMA, ハニホヘト]
  }
}
```

##3つの数の整列
>３つの整数を読み込み、それらを値が小さい順に並べて出力するプログラムを作成して下さい。

```Java
import java.util.Arrays;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int num1 = scanner.nextInt();
		int num2 = scanner.nextInt();
		int num3 = scanner.nextInt();
		int[] nums = {num1,num2,num3};
		Arrays.sort(nums);
		
		System.out.println(String.format("%s %s %s", nums[0],nums[1],nums[2])); //46 50 80
		
	}
}
```