【Java】文字判定・文字列整形（AOJ11 - 文字のカウント）

#アルファベットの小文字かどうか判定
* ASCIIコード表で’a’から'z'は連続している
    * 'b'の値は'a'の値よりも１大きい
* c がアルファベットの小文字なら真になるコードを書くには<br>`c >= 'a' && c <= ‘z’`

```java
//c がアルファベットの小文字なら真になるコード
public class Main {
    public static void main(String[] args){
    char c = 'c';
    
    System.out.printf("確認したい文字cは?  '%s'\n", c);
    /*cがアルファベットの小文字なら真*/
    if (c >= 'a' && c <= 'z')
        System.out.println("c は小文字");
    /*cが英小文字なら真*/
    if (c >= 'a' && c <= 'z')        
        System.out.println("c は小文字");
    else
        System.out.println("c は小文字ではない");
    /*cが数字なら真*/
    if (c >= '0' && c <= '9')       
        System.out.println("c は数字");
    else
        System.out.println("c は数字ではない");
    /*cが'+'か'-'なら真*/
    if (c == '+' || c == '-')     
        System.out.println("c は符号");
    else
        System.out.println("c は符号ではない");
    }
}

```

```java
確認したい文字cは?  'c'
c は小文字
c は小文字
c は数字ではない
c は符号ではない
```

#ScannerクラスのhasNext関数で繰り返し判定
* 入力を読み込んでまだ繰り返し続行を判定する
* 前から順番に値を取得していき、まだ値を取得できる時にはtrueを、これ以上値を取得できない場合にはfalse

```java
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
    String str = scanner.next();
    System.out.println(str);
}
```

#文字列整形
* **formatメソッド**：書式指定子を使って値を任意の形式に変換
* **printfメソッド**：formatの代わりにそのまま表示。改行文字は付与しない
* 書式指定子：書式文字列の中に値を埋めこむための記法
* 書式指定子以外はそもまま出力
* 書式指定子の例
* `System.out.println(String.format("%sの体重はりんご%d個分です。","アルクマ",70));`
    * 1\$,2\$：1,2番目の引数を表す
    * %.2s：文字列の最小幅指定
    * %8s：文字列の幅指定。不足した分は左が空白。負数で右空白
    * %#x：　接頭辞に0/0xをつけて16進数表示
    * %.2e：小数点以下の2桁表示、eで指数表記
    * %tF：日付 %tY-%tm-%td と同じ
    * %td：時刻

```java
import java.util.*;
import java.time.LocalDateTime;
import java.util.Locale;

public class Main {
 public static void main(String[] args) {
    System.out.println(String.format("%sの体重はりんご%d個分です。","アルクマ",70)); 
    System.out.println(String.format("%1$sの体重はりんご%3$d個分です。%1$sは元気です。","アルクマ","キティ",70)); //アルクマの体重はりんご70個分です。アルクマは元気です。
    //文字列の最小幅指定
    System.out.println(String.format("%.2sです。", "アルクマ"));       //アルです。
    //文字列の幅指定
    System.out.println(String.format("%8sです。", "アルクマ"));        //    アルクマです。
    //最大桁数指定
    System.out.println(String.format("10進数 %08d", 12345));          //10進数 00012345
    //16進数
    System.out.println(String.format("16進数 %#x", 10));              //16進数 0xa
    //小数点以下の桁数指定
    System.out.println(String.format("小数点数 %.2f", 123.456));      //小数点数 123.46
    //指数
    System.out.println(String.format("指数／小文字 %.2e", 123.456));  //指数／小文字 1.23e+02
    //日時
    var d = LocalDateTime.now();
    System.out.println(String.format("%tr", d));                      //03:42:23 AM
    System.out.println(String.format("%1$tY年 %1$tm月 %1$td日", d));  //2020年 10月 31日
    //printfメソッドで表示
    System.out.printf("%.2sです。\n", "アルクマ");  
  }
}
```


#文字のカウント（ITP1-8）
>与えられた英文に含まれる、各アルファベットの数を数えるプログラムを作成して下さい。 なお、小文字と大文字は区別しません。
Input
複数の行にまたがる１つの英文が与えられます。
Output
与えられた英文に含まれる各アルファベットの数を以下に示す形式で出力して下さい：
a : aの個数
b : bの個数
c : cの個数
  .
  .
z : zの個数
Constraints
* 英文が含む文字の数 < 1200

```java

import java.util.Scanner;

public class Main {
    public static void main(String[] args){
        Scanner scan=new Scanner(System.in);
        int alf[]=new int[26];
        while(scan.hasNext()){
            String str=scan.next().toLowerCase();
            for(int i=0;i<str.length();i++){
                char c=str.charAt(i);
                if('a'<=c&&c<='z'){
                    alf[str.charAt(i)-'a']++;
                }
            }
        }
        for(int i=0;i<26;i++)System.out.println((char)('a'+i)+" : "+alf[i]);
        scan.close();
    }
}
```