[自分用メモ]Java文法のサンプルコード　随時更新

## 自己紹介
Javaを勉強したての社会人一年目です。
Javaの文法についてメモみたいな感じでまとめています。
文法については、「調べるのめんどくせーw」「覚えるのめんどくせーw」って感じなので、完全個人用メモです笑笑
※業務等でこれからよく使ったり、便利な文法が見つかり次第更新する予定です。

Javaに関するアドバイス等募集中です。

## 文字列分割
```java:例
String str = new String("星野みなみ,齋藤飛鳥,堀未央奈");
String[] oshi = str.split(",");

// 出力
for (int i=0; i < oshi.length; i++) {
  System.out.println(oshi[i]);
}
```

```java:出力
星野みなみ
齋藤飛鳥
堀未央奈
```

## 文字列比較
```java:例
String str1 = "星野みなみ";
String str2 = "星野みなみ";
String str3 = "寺田蘭世";

// 比較
// str1とstr2
if (str1.equals(str2)) {
  System.out.println("等しい");
} else {
  System.out.println("等しくない");
}

// 比較
// str1とstr3
if (str1.equals(str3)) {
  System.out.println("等しい");
} else {
  System.out.println("等しくない");
}

```

```java:出力
等しい
等しくない
```

## 文字 ⇔ 数値 変換

```java:例
// 数値 → 文字列
String Sinput = String.valueOf(input);

// 文字列 → 数値
int input = Integer.parseInt(Sinput);
```

## 正規表現
### 日付
文字列ymdに格納された日付が、YYYY/MM/DDの形になっているかを判定。

```java:例
Pattern p = Pattern.compile("^[0-9]{4}/[0-9]{2}/[0-9]{2}$");
Matcher m = p.matcher(ymd);
m.find(); // マッチしてたらtrue,マッチしてなかったらfalse
```

### 時間
文字列timeに格納された時間が、HH:mmの形になっているかを判定。

```java:例
Pattern p = Pattern.compile("^[0-9]{2}:[0-9]{2}$");
Matcher m = p.matcher(time);
m.find(); // マッチしてたらtrue,マッチしてなかったらfalse
```

### その他の正規表現

```java:例
// URL
Pattern p = Pattern.compile("^https?://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$");

// ドメイン名
Pattern p = Pattern.compile("^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z-]{2,}$");

// 固定電話番号
Pattern p = Pattern.compile("^0\d(-\d{4}|\d-\d{3}|\d\d-\d\d|\d{3}-\d)-\d{4}$");

// 携帯電話番号
Pattern p = Pattern.compile("^0[789]0-\d{4}-\d{4}$");

// フリーダイヤル
Pattern p = Pattern.compile("^(0120|0800)-\d{3}-\d{3}$");

// 郵便番号
Pattern p = Pattern.compile("^\d{3}-\d{4}$");
```

## 日付、時間フォーマット指定

```java:例
SimpleDateFormat df = new SimpleDateFormat("yyyy/MM/dd (E)", Locale.JAPANESE);
SimpleDateFormat de = new SimpleDateFormat("yyyy/MM/dd");
SimpleDateFormat dd = new SimpleDateFormat("HH:mm");
SimpleDateFormat dc = new SimpleDateFormat("HH:mm:ss");
```

## 現在の日時を取得
現在の日時を取得し、**Today**に格納

```java:例
SimpleDateFormat de = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

// 現在の日付を取得
Date today = new Date();
today.toString();
String Today = de.format(today);
```

## 日付比較( equal()、after()、before() )

```java:例
public void dateTodate() throws ParseException {
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
  Date date1 = sdf.parse("2020/04/01");
  Date date2 = sdf.parse("2020/04/30");
  Date date3 = sdf.parse("2020/04/01");

  if (date1.equals(date3)) {
    System.out.println("date1とdate3は同じ日");
  }

  if (date1.before(date2)) {
    System.out.println("date1はdate2に比べて過去");
  }

  if (date2.after(date1)) {
    System.out.println("date2はdate1に比べて未来");
  }
}
```

```java:出力
date1とdate3は同じ日
date1はdate2に比べて過去
date2はdate1に比べて未来
```

## 閏年判定
変数ymd_YYY(西暦4桁の年数)が閏年かどうかを判定。

```java:例
// 閏年判定
if (Integer.parseInt(ymd_YYYY) % 4 == 0) {
	if ((Integer.parseInt(ymd_YYYY) % 100) == 0) {
		if ((Integer.parseInt(ymd_YYYY) % 400) == 0) {
			// うるう年
		}
	} else {
		// うるう年
	}
} 
```

## 干支判定
int yearに年数(西暦4桁)を格納すると、その年の干支を返却する。


```java:例
// 干支判定
private static String isJudgeEto(int year) {
	
  String[] Alleto = {"申(さる)", "酉(とり)", "戌(いぬ)", "亥(いのしし)", "子(ねずみ)"
            , "牛(うし)", "寅(とら)", "卯(うさぎ)", "辰(たつ)", "巳(へび)", "午(うま)", "未(ひつじ)"};
		
  int i = year % 12;
  String eto = Alleto[i];
		
  return eto;
}
```

## 2次元配列のコピー

```java:例
String[][] oshi = { {"星野みなみ", "齋藤飛鳥", "堀未央奈"}, {"みなみ", "あすか", "みおな"}, {"千葉県", "東京都", "岐阜県"}};
String[][] oshi_copy = new String[oshi.length][];

for (int i=0; i < oshi.length; i++) {
	oshi_copy[i] = new String[oshi[i].length];
	
	for (int j=0; j < oshi[i].length; j++) {
		oshi_copy[i][j] = oshi[i][j];
	}
}

// 出力
for (int i=0; i < oshi_copy.length; i++) {
	for (int j=0; j < oshi_copy[i].length; j++) {
		System.out.println(oshi_copy[i][j]);
    }
}
```

```java:出力
星野みなみ 
齋藤飛鳥 
堀未央奈 
みなみ 
あすか 
みおな 
千葉県 
東京都 
岐阜県 
```

## for文(for、拡張for、foreach)

```java:例
// for
// スタンダード
for (int i=0; i < 10; i++) {
  // 処理
}

// 拡張for
// 配列やリストのすべての要素に順番に処理を行う場合に使ったりする
for (String str : Array) {
  // 処理
}

// forEach
// 上2つより簡潔に書くことが可能(自分は完全に理解しきれていないが...)
str.forEach( i -> // 処理 );

```

## 配列のソート
数値、文字どちらでもソート可能。

```java:例
String[] osi = {"ほしのみなみ", "てらだらんぜ", "ほりみおな", "さいとうあすか"};

// 昇順ソート
Arrays.sort(osi);
System.out.println(Arrays.asList(osi));

// 降順ソート
Arrays.sort(osi, Collections.reverseOrder());
System.out.println(Arrays.asList(osi));
```

```java:出力
[さいとうあすか, てらだらんぜ, ほしのみなみ, ほりみおな] 
[ほりみおな, ほしのみなみ, てらだらんぜ, さいとうあすか]
```

## リストのソート
数値、文字どちらでもソート可能。

```java:例
ArrayList<String> osi = new ArrayList<>();
        
osi.add("ほしのみなみ");
osi.add("ほりみおな");
osi.add("てらだらんぜ");
osi.add("さいとうあすか");

// 昇順ソート
Collections.sort(osi);
System.out.println(osi);

// 降順ソート
Collections.sort(osi, Collections.reverseOrder());
System.out.println(osi);
```

```java:出力
[さいとうあすか, てらだらんぜ, ほしのみなみ, ほりみおな] 
[ほりみおな, ほしのみなみ, てらだらんぜ, さいとうあすか]
```

## 素数判定
numの値が素数ならtrue、素数じゃないならfalseを返す。

```java:素数判定クラス
private static boolean isJudgeNum(int num) {
  if (num <= 1)
    return false;
		
  for (int i = 2; i < num; i++) {
    if (num % i == 0) 
      return false;
  }

  return true;
}
```

## 和暦変換
変数input(西暦4桁の年数)が入力されると、和暦の年度に変換して返却する。

```java:和暦変換
// 和暦変換クラス
private static String isJudgeWareki(int input) {
  int[] Syear = {1868, 1912, 1926, 1989, 2019, 9999};
  String[] wareki = {"明治", "大正", "昭和", "平成", "令和", ""};
  int Wyear = 0;
  String w = "";
		
  int i=0;
  while (Syear[i] <= input) {
    Wyear = input - Syear[i] + 1; // 年数を設定
    w = wareki[i]; // 元号を設定
    i++;
  }

  String ymd = w + Wyear + "年";	
  return ymd;
}
```

## おわりに
みなさん的によく使うJava文法とかありましたら、コメント欄にて募集中です笑笑

上昇気流のがさないで絶対キユウ前向いて♪♪♪