Java : CharSequence - API使用例
CharSequence (Java SE 18 & JDK 18) の使用例まとめです。
だいたいのメソッドを網羅済みです。
API仕様のおともにどうぞ。
概要
CharSequenceはchar値の読取り可能なシーケンスです。 このインタフェースは、さまざまな種類のcharシーケンスへの統一された読取り専用アクセスを提供します。
CharSequence は、文字(char)のシーケンス(列)を取得するためのシンプルなインタフェースです。
読み取り専用で、このインタフェースを使った文字シーケンスの更新はできません。
文字列 や StringBuilder などで実装されています。
// CharSequenceを、1文字ずつ出力します。
public void printCharSequence(CharSequence cs) {
cs.codePoints().forEach(c -> {
System.out.printf("%c", c);
});
System.out.println();
}
// String、StringBuilderどちらも対応できます。
final var str = "abcd";
printCharSequence(str);
final var sb = new StringBuilder("xyz");
printCharSequence(sb);
sb.append("ABC");
printCharSequence(sb);
// 結果
// ↓
// abcd
// xyz
// xyzABC
CharSequence には文字を取得するメソッドがいくつかあります。
その中では、サロゲート・コード・ペアを解決してくれる codePoints() をおすすめします。
メソッド
char charAt (int index)
指定されたインデックスのchar値を返します。
final CharSequence cs = "abc";
//cs.charAt(-1); // IndexOutOfBoundsException
System.out.println(cs.charAt(0)); // a
System.out.println(cs.charAt(1)); // b
System.out.println(cs.charAt(2)); // c
//cs.charAt(3); // IndexOutOfBoundsException
// サロゲート・コード・ポイントの例
final var surrogate = "\uD867\uDE3D"; // "𩸽"という1文字
System.out.println(surrogate); // "𩸽"
final CharSequence cs = surrogate + "ab";
System.out.println(cs); // "𩸽ab"
final var ret1 = cs.charAt(0);
System.out.println(ret1); // ? <- 文字化け
System.out.println(Integer.toHexString(ret1)); // d867 <- サロゲート値
final var ret2 = cs.charAt(1);
System.out.println(ret2); // ? <- 文字化け
System.out.println(Integer.toHexString(ret2)); // de3d <- サロゲート値
final var ret3 = cs.charAt(2);
System.out.println(ret3); // a
final var ret4 = cs.charAt(3);
System.out.println(ret4); // b
//cs.charAt(4); // IndexOutOfBoundsException
default IntStream chars ()
このシーケンスのchar値をゼロ拡張したintを含むストリームを返します。
個人的には、charsメソッドより、サロゲート・コード・ペアを解決してくれる codePoints() をおすすめします。
final CharSequence cs = "abcd";
cs.chars().forEach(c -> {
System.out.println("%x : %c".formatted(c, c));
});
// 結果
// ↓
// "61 : a"
// "62 : b"
// "63 : c"
// "64 : d"
// サロゲート・コード・ポイントの例です。
final var surrogate = "\uD867\uDE3D"; // "𩸽"という1文字
System.out.println(surrogate); // "𩸽"
final CharSequence cs = "ab" + surrogate;
System.out.println(cs); // "ab𩸽"
cs.chars().forEach(c -> {
System.out.println("%x : %c".formatted(c, c));
});
// 結果
// ↓
// "61 : a"
// "62 : b"
// "d867 : ?" <- 文字化け
// "de3d : ?" <- 文字化け
default IntStream codePoints ()
このシーケンスからコード・ポイント値のストリームを返します。
final CharSequence cs = "abcd";
cs.codePoints().forEach(cp -> {
System.out.println("%x : %c".formatted(cp, cp));
});
// 結果
// ↓
// "61 : a"
// "62 : b"
// "63 : c"
// "64 : d"
// サロゲート・コード・ポイントの例です。
final var surrogate = "\uD867\uDE3D"; // "𩸽"という1文字
System.out.println(surrogate); // "𩸽"
final CharSequence cs = "ab" + surrogate;
System.out.println(cs); // "ab𩸽"
cs.codePoints().forEach(cp -> {
System.out.println("%x : %c".formatted(cp, cp));
});
// 結果
// ↓
// "61 : a"
// "62 : b"
// "29e3d : 𩸽"
static int compare (CharSequence cs1, CharSequence cs2)
2つのCharSequenceインスタンスを辞書的に比較します。
final CharSequence cs1 = "abcd";
final CharSequence cs2 = "xyz";
final CharSequence cs3 = "XYZ";
System.out.println(CharSequence.compare(cs1, cs2)); // -23
System.out.println(CharSequence.compare(cs1, cs3)); // 9
System.out.println(CharSequence.compare(cs2, cs3)); // 32
final CharSequence cs1 = "abcd";
final CharSequence cs2 = new StringBuilder("xyz");
final CharSequence cs3 = new StringBuilder("abcd");
System.out.println(CharSequence.compare(cs1, cs2)); // -23
System.out.println(CharSequence.compare(cs1, cs3)); // 0
System.out.println(CharSequence.compare(cs2, cs3)); // 23
default boolean isEmpty ()
この文字シーケンスが空の場合、trueを返します。
final CharSequence cs1 = "";
final CharSequence cs2 = "abcd";
System.out.println(cs1.isEmpty()); // true
System.out.println(cs2.isEmpty()); // false
final var sb = new StringBuilder();
final CharSequence cs = sb;
System.out.println(cs); // ""
System.out.println(cs.isEmpty()); // true
sb.append("xyz");
System.out.println(cs); // "xyz"
System.out.println(cs.isEmpty()); // false
int length ()
この文字シーケンスの長さを返します。
final CharSequence cs1 = "";
final CharSequence cs2 = "abcd";
System.out.println(cs1.length()); // 0
System.out.println(cs2.length()); // 4
final var sb = new StringBuilder();
final CharSequence cs = sb;
System.out.println(cs); // ""
System.out.println(cs.length()); // 0
sb.append("xyz");
System.out.println(cs); // "xyz"
System.out.println(cs.length()); // 3
CharSequence subSequence (int start, int end)
このシーケンスのサブシーケンスであるCharSequenceを返します。
final CharSequence cs = "abcd";
System.out.println(cs.subSequence(0, 0)); // ""
System.out.println(cs.subSequence(0, 1)); // "a"
System.out.println(cs.subSequence(0, 2)); // "ab"
System.out.println(cs.subSequence(0, 3)); // "abc"
System.out.println(cs.subSequence(0, 4)); // "abcd"
//cs.subSequence(0, 5); // IndexOutOfBoundsException
System.out.println(cs.subSequence(0, 4)); // "abcd"
System.out.println(cs.subSequence(1, 4)); // "bcd"
System.out.println(cs.subSequence(2, 4)); // "cd"
System.out.println(cs.subSequence(3, 4)); // "d"
System.out.println(cs.subSequence(4, 4)); // ""
String toString ()
このシーケンス内の文字を含む文字列を、このシーケンスと同じ順序で返します。
final CharSequence cs1 = "abcd";
System.out.println(cs1.toString()); // "abcd"
final CharSequence cs2 = new StringBuilder("xyz");
System.out.println(cs2.toString()); // "xyz"
final CharSequence cs = "あいうえお";
System.out.println(cs.toString()); // "あいうえお"