Java講座: 標準ライブラリ
Javaには標準で利用できるさまざまなクラスが存在します。標準ライブラリというとなにか難しそうに感じるかもしれませんが、要は「公式が用意してくれている便利メソッド集」みたいなものです。
Javaの標準ライブラリはあまりにもたくさんあるため全部紹介することはできませんが、よく使われるものに絞って紹介します。
乱数の生成
乱数はその名の通りランダムな数のことです。Javaで乱数を生成するためにはjava.utilパッケージにあるRandomクラスを使います。 したがって、import java.util.Randomの文が必要になります。 乱数がほしいときによく使うのはnextDouble()メソッドとnextInt()メソッドでしょう。 nextDouble()は$0.0~1.0$(ただし、$1.0$は含まない)までのdouble型の乱数を生成し、nextInt()は$0~2^{32}$(ただし、$2^{32}$は含まない)までのint型の乱数を生成します。nextInt()は引数によって生成したい範囲を絞ることができます。
import java.util.Random;
public class Main {
public static void main(String[] args) {
Random rand = new Random();
System.out.println(rand.nextDouble());
System.out.println(rand.nextInt());
System.out.println(rand.nextInt(10))// 0~9の乱数
}
}数値と文字列の変換
どこかの資料の余談のところで話したような気がするので詳しい説明は省きます。 数値 → 文字列の変換はString.valueOf()メソッドを用います。
int x = 1;
int y = 2;
String xStr = String.valueOf(x);
String yStr = String.valueOf(y);
System.out.println(xStr + yStr);一方で、文字列 → 数値の変換はInteger.parseInt()やDouble.parseDouble()メソッドなどを用いてください。
文字列の操作
1. 文字列の長さの取得
lengthメソッドを使用すれば文字列の長さ(文字数)が取得できます。
String s = "Hello";
System.out.println(s.length());2. 文字列の比較
「文字列の比較って何?」と思うかもしれません。要は辞書的な大小を知りたいときに使うメソッドのことです。
equalsメソッド 文字列が同じかどうかを確かめるときには必ずequalsメソッドを使うようにしてください。整数の比較のときと同じようについ==を用いて比較したくなりますが、これでは正しく比較することができません。equalsメソッドは==演算子同様、trueかfalseを返します。javaString s = "Hello"; if (s.equals("Hello")) { System.out.println("同じです。"); }大小関係を知りたいとき(
compareTo) 文字列の辞書的な大小関係を知りたい場合は、compareToメソッドが使用できます。javaString str1 = "abc"; String str2 = "def"; if (str1.compareTo(str2) > 0) { System.out.println(str1 + "は" + str2 + "より大きいです"); } else if (str1.compareTo(str2) < 0) { System.out.println(str1 + "は" + str2 + "より小さいです"); } else { System.out.println(str1+ "と" + str2 + "は同じです"); }compareToメソッドは現在の文字列str1と引数の文字列str2を比較し、str1 > str2 なら正の値、str1 < str2 なら負の値、str1 = str2 なら0を返します。
3. 文字列が空かどうかを確認する
文字列が空かどうかを確認するメソッドとしてisEmptyメソッドとisBlankメソッドがあります。似たようなものに感じられますが、実は大きな違いがあります。以下のコードを実行してみてください。
String str1 = "";
String str2 = " \n";
System.out.println(str1.isEmpty());
System.out.println(str2.isEmpty());
System.out.println(str1.isBlank());
System.out.println(str2.isBlank());4. 文字列から空白を除去
文字列の前後の空白を除去するにはstripメソッドを使用します。前方の空白だけを除去するstripLeading、後方の空白だけを除去するstripTrailingも存在しますが、今はいいでしょう。
String str = " Hello, world! ";
System.out.println(str.strip());5. 特定の文字列が含まれるか検索する
文字列の中にある特定の文字列が含まれているかを確認したいときにはcontainsメソッドを使います。
また、ある文字列で始まる / 終わるかを確認するときには startsWith / endsWith メソッドが利用できるでしょう。
String s = "Hello, world!";
System.out.println(s.contains("Hello"));
System.out.println(s.startsWith("Hello"));
System.out.println(s.endsWith("Hello"));6. 部分文字列の取得
ある文字列から、そのうちの一部だけを取り出したい場合、substringメソッドが利用できます。 初めて使うときには挙動が少しわかりにくく感じるかもしれません。以下のコードを実行してどのように出力されるのか確かめてみましょう。
String s = "Hello, world!";
System.out.println(s.substring(0, 5));
System.out.println(s.substring(1));
System.out.println(s.substring(7, 9));7. 文字列の分割
文字列を特定の区切り文字で分割する方法として、splitメソッドが利用できます。
String str = "みかん,りんご,いちご";
String[] result = str.split(",");
for (String element : result) {
System.out.println(element);
}日付/時刻
Javaには日付/時刻の操作のためにDate-Time APIというものが用意されています。これらはjava.timeパッケージをインポートすることで使えるようになります。
「インポートって何?」と思ったかもしれませんが、標準入力のときに書いたこれ↓です。
import java.util.Scanner;日付/時刻の操作をするクラスは3種類ほどありますが、おそらくそのうちの1つであるLocalDateTimeだけ覚えておけば十分でしょう。つまり、日付/時刻を操作したいときにはまずプログラムの先頭にこう↓書けばよいわけですね。
import java.time.LocalDateTime;1. 現在時刻の取得
現在時刻を取得するにはLocalDateTime.nowメソッドを使用します。
import java.time.LocalDateTime;
public class Main {
public static void main(String[] args) {
LocalDateTime now = LocalDateTime.now();
System.out.println(now);
}
}LocalDateTimeの現在時刻はシステムのタイムゾーンに合わせて表示されます。私たちのPCのシステムはおそらく日本に設定されていると思うので、表示される時刻も日本標準時でしょう。(違ったら教えて)
出力結果を見て「長ったらしいし見にくくね?」と思ったかもしれません。デフォルトの出力結果はデータベースのタイムスタンプなどには使えますが、人間が見るにはちょっと分かりにくいです。
2. 年月日、時分秒などの要素を取得する
時刻要素を取得するために以下のメソッド群が用意されています。よく使うものだけピックアップします。
| メソッド | 概要 |
|---|---|
| getYear() | 年を取得 |
| getMonth() | 月名を取得 |
| getMonthValue() | 月を数値で取得 |
| getDayOfMonth() | 日を取得 |
| getDayOfWeek() | 曜日を取得 |
| getHour() | 時を取得 |
| getMinute() | 分を取得 |
これらを使って現在時刻をもう少し見やすくしましょう。
現在時刻を取得し、〇〇年××月△△日の形式で出力させるプログラムを作ってみてください。がんば!
3. 日付/時刻値の整形
プログラムを作ってみて、めんどくせえと思ったのではないでしょうか。実はいい感じに整形してくれる機能が標準でサポートされています。が、LocalDateTimeでサポートされている標準のフォーマットは少し分かりにくいです(筆者の主観)。日本に合ったフォーマットを利用したい場合にはZonedDateTimeというクラスを使用することをおすすめします。気になった人は各自調べてみてください。
4. 時間の差分の取得
2つの時刻の差分を計算するライブラリとして、PeriodクラスとDurationクラスが提供されています。Periodクラスは日付間隔を、Durationクラスは時間間隔を計算してくれます。
実際にプログラムを見たほうが早いでしょう。
import java.time.Duration;
import java.time.Period;
import java.time.LocalDate;
import java.time.LocalDateTime;
public class Main {
public static void main(String[] args) {
LocalDateTime t1 = LocalDateTime.of(2023, 12, 30, 0, 0, 0);
LocalDateTime t2 = LocalDateTime.now();
Period period = Period.between(t1.toLocalDate(), t2.toLocalDate());
System.out.println("日付の差: " + period.getYears() + "年" + period.getMonths() + "ヶ月" + period.getDays() + "日");
Duration duration = Duration.between(t1, t2);
System.out.println("時間の差: " + duration.toHours() + "時間");
}
}ストリーム
ストリームとは、入出力を実行する仕組みのことです。これを利用することで、ファイルでもネットワークでも同じように入出力を行うことができます。 ここでは、どこかの資料の余談でやったテキストファイルへの入出力の方法を再掲します。
テキストファイルからの入力
Javaはコンソールからだけでなく、テキストファイルに書かれている内容も入力として受け取ることができます。実際にやってみましょう。Main.javaがあるフォルダにinput.txtという名前のファイルを新しく作成してください。
その後、input.txtに以下のように書きます。
1
2
3
4
5
6
7
8
9一つ数字を書くごとに改行してください。
そうしたら、Main.javaに以下のようなコードを書いてください。
import java.io.BufferedReader;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
public class Main {
public static void main(String[] args) {
int sum = 0;
try (BufferedReader br = Files.newBufferedReader(Paths.get("./input.txt"))) {
String line = "";
// ファイルの最後の行になるまで、各行を読み込む
while ((line = br.readLine()) != null) {
int lineInt = Integer.parseInt(line); // lineは文字列のため、int型に変換する
sum += lineInt;
}
System.out.println(sum);
} catch (IOException e) {
e.printStackTrace();
}
}
}このコードは、input.txtに書かれている数の和を計算して出力するものです。うまく実行できていれば、1~9までの数字の和、すなわち45がコンソールに出力されるはずです。
肝心のinput.txtを読み込む処理は10行目のtry (BufferedReader br = ...)のところで書かれています。今完全に理解する必要はありません。「こうやって書けばファイルが読み込めるんだなあ」くらいに考えておいてください。(ぶっちゃけ調べればいくらでも出てくる)
テキストファイルへの出力
あまり使いませんが、せっかくだし解説します。
入力のときにはBufferedReaderという型(厳密にはクラス)を使用しました。出力のときにはBufferedWriterを使用します。
読み込むからReader、書き込むからWriterと覚えましょう。
Main.javaを以下のように書き換えてください。
import java.io.BufferedWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
public class Main {
public static void main(String[] args) {
String s = "Hello, world!";
try (BufferedWriter bw = Files.newBufferedWriter(Paths.get("./output.txt"), StandardOpenOption.CREATE)) {
bw.write(s);
bw.newLine();
} catch (IOException e) {
e.printStackTrace();
}
}
}これはoutput.txtというファイルを作成し、「Hello, world!」という文字列を書き込むプログラムです。StandardOpenOption.CREATEは、「もしoutput.txtというファイルがなかったら、新しく作成する」というオプションです。
入力のときと同様、「こうすればファイルに書き込めるんだなあ」程度の理解で十分です。
モダンなファイル入出力
Java 7以降ではFilesクラスを使うことによってめっちゃ簡単にファイル入出力ができます。
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.List;
public class ModernFileIO {
public static void main(String[] args) {
String message = "12345" + '\n'
+ "かきくけこ" + '\n'
+ "さしすせそ" + '\n';
// ファイルへの書き込み
try {
Files.writeString(Paths.get("hoge.txt"), message, StandardOpenOption.CREATE, StandardOpenOption.APPEND);
} catch (IOException e) {
e.printStackTrace();
}
// ファイルの読み込み
try {
List<String> lines = new ArrayList<>();
Files.readAllLines(Paths.get("hoge.txt"));
lines.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
}
}計算
JavaのMathクラスには計算を行う上での便利なメソッドがたくさんあります。日付/時刻のときと異なり、Mathクラスを使用するためになにかをインポートする必要はありません。
| メソッド | 概要 |
|---|---|
| abs(T x) | 絶対値 |
| min(T x, T y) | 最小値 |
| max(T x, T y) | 最大値 |
| ceil(double x) | 切り上げ |
| floor(double x) | 切り捨て |
| round(float x) | 四捨五入 |
| sqrt(double x) | 平方根 |
| cbrt(double x) | 立方根 |
| pow(double x, double y) | xのy乗 |
| sin(double x) | サイン |
| cos(double x) | コサイン |
| tan(double x) | タンジェント |
| exp(double x) | eのx乗 |
| log(double x) | 自然対数 |
| log10(double x) | 常用対数 |
Math.メソッド名の形式で呼び出せます。例えばx = -10の絶対値を知りたいときには、Math.abs(x)と記述することで求められます。
配列の操作
配列を操作できるメソッド群は、java.utilパッケージにあるArraysクラスにあります。 よく使うのはsortメソッドくらいでしょう。なぜなら基本的には配列を使用する際には後々解説するArrayListと呼ばれるクラスを使用するほうが便利であり、そのArrayListの操作にArraysクラスは使用できないからです。
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] list = {5, 39, 20, 1736, 4, 1, 9, 47, 0};
Arrays.sort(list);
for (int i = 0; i < list.length; i++) {
System.out.println(list[i]);
}
}
}