[Java]使いそうな部分まとめ

# はじめに
学内でJavaの競技会があるらしいので、競技プログラミングで使えそうな記述をまとめておきました

# 参考

[Java　標準入力 - Qiita](https://qiita.com/mat827/items/4fdd334498c05e942c63)

[Javaの文字列操作【プログラミング初心者向け教材】](https://tokitsubaki.com/java-string-manipulation/147/#:~:text=Java%E3%81%AE%E6%96%87%E5%AD%97%E5%88%97%E6%93%8D%E4%BD%9C%201%20%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E7%B5%90%E5%90%88%E3%81%97%E3%81%9F%E3%81%84%20%E6%9C%80%E3%82%82%E5%8D%98%E7%B4%94%E3%81%AA%E3%81%AE%E3%81%AF%E3%80%81%20%EF%BC%8B%E6%BC%94%E7%AE%97%E5%AD%90%20%E3%81%A7%E7%B5%90%E5%90%88%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%A7%E3%81%99%E3%80%82%20...%202,...%207%20%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E9%85%8D%E5%88%97%E3%81%AB%E5%88%86%E5%89%B2%E3%81%97%E3%81%9F%E3%81%84%20...%208%20%E6%96%87%E5%AD%97%E5%88%97%E3%82%92%E3%83%88%E3%83%AA%E3%83%9F%E3%83%B3%E3%82%B0%E3%81%97%E3%81%9F%E3%81%84%20...%20%E3%81%9D%E3%81%AE%E4%BB%96%E3%81%AE%E3%82%A2%E3%82%A4%E3%83%86%E3%83%A0)

# 標準入出力

## 入力

### 基本

```java
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in); // Scanner クラスは標準入力を取得するのに必要
        String s = sc.next();  // 文字列
		int n = sc.nextInt();  // 整数
    }
}
```

### 一行複数・複数行一列

どちらも同じように `next()` で取れる。

```java
// 要素数をnとする
String[] a = new Array(n);
for(int i=0; i<n; i++) a[i] = sc.next();
```

### 複数行複数（二次元）

`nextLine()` で取得した行を`split()` で分割する方法もあるが、たいていは二重ループで解決できる。

```java
for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
        s[i][j] = in.next();
    }
}
```

## 出力

### 基本

```java
System.out.println(out);
```

# 文字列操作

## 結合

単にふたつの文字列を結合するのみであれば、******************************+演算子******************************でいい。

```java
String s = "hoge" + "huga"; // hogehuga
```

破壊的変更（変数の値を書き換えること）もできる。

```java
String s = "hoge";
s += "huga"; // hogehuga
```

## 抽出

`String.substring(start, end)` を使う。

扱い方はPythonのスライスと大差ないが、インデックスにマイナスを指定することはできない。

```java
String s = "hogehugapiyo";
System.out.println(s.substring(4, 8)); // "huga"
```

## 長さを求める

`String.length()` で可能。

```java
String s = "hoge";
System.out.println(s.length()); // 4
```

0文字であるかどうかを判定したい場合は、かわりに`String.isEmpty()` を使うこともできる。

```java
String s = "";
System.out.println(s.isEmpty()); // true
```

## 検索

### 正規表現

`String.matches(format)`に正規表現を示す文字列を与えることで検索できる。

```java
String s = "hogehugapiyo";
System.out.println(s.matches(".*huga.*")); // true
```

### 含むか

「～を含む」かどうかを調べるときには`String.contains()`が使える。

```java
String s = "hogehugapiyo";
System.out.println(s.contains("hoge")); // true
```

### 前方検索

「～から始まる」かどうかを調べるときには`String.startsWith()`が使える。

```java
String s = "hogehugapiyo";
System.out.println(s.startsWith("hoge")); // true
```

### 後方検索

「～で終わる」かどうかを調べるときは`String.endsWith()`を使う。

```java
String s = "hogehugapiyo";
System.out.println(s.endsWith("piyo")); // true
```

### インデックス検索

指定した文字が最初・最後に現れる位置のインデックスを取得したい場合、`String.indexOf(), String.lastIndexOf()`を使う。

このとき、基準となるのは文字列の頭の位置である点に注意。

```java
String s = "hogehugapiyo";
System.out.println(s.indexOf("huga"));  // 4
```

## 置換

置換には`String.replace(old, new)`を用いる。

`old`に一致する文字列はすべて`new`に置き換えられる。

```java
String s = "abcabcabc";
System.out.println(s.replace("a", "x")); // xbcxbcxbc
```

特定の文字列を削除する際も同様の方法をとる。

```java
String s = "hogehugapiyo";
System.out.println(s.replace("huga", "")); // hogepiyo
```

正規表現を使いたい場合、かわりに`String.replaceAll(old, new)`を使う。

```java
String s = "abcabcabc";
System.out.println(s.replaceAll("[abc]", "x")); // xxxxxxxxx
```

正規表現を用いて、かつ最初に見つかった文字列を置き換える場合、`String.replaceFirst(old, new)`を使う。

```java
String s = "abcabcabc";
System.out.println(s.replaceFirst("[abc]", "x")); // xbcabcabc
```

## 分割

文字を区切って配列に格納する際は`String.split(delimiter)`を用いる。こちらは区切り文字の指定が必要。

```java
String s = "hoge huga piyo";
String[] l = s.split(" "); // ["hoge", "huga", "piyo"]
```

# 型変換

### 文字列→整数

`Integer.parseInt()`を使う。

```java
String s = "123";
int n = Integer.parseInt(s); // 123
```

### 整数→文字列

`String.valueOf()`を使う。

```java
int n = 123;
String s = String.valueOf(123); // "123"
```

# 比較

ほとんどの場合、比較演算子`==`で解決する…が、StringやInteger型は************オブジェクト型************なので注意。

これらの型は`equals()`で比較する。

```java
String s = "hoge";
System.out.println(s.equals("hoge")); // true
```