1. 概要

このチュートリアルでは、N個の繰り返し文字の文字列を生成するためのさまざまなオプションについて説明します。 これは、パディング空白を追加したり、ASCIIアートを作成したりする必要がある場合に便利です。

この問題はJDK11で簡単に解決できますが、以前のバージョンを使用している場合は、他にも多くの解決策があります。 最も一般的なものから始めて、いくつかのライブラリから他のアプローチを追加します。

2. 例

生成された文字列を検証するためにすべてのソリューションで使用する定数を定義しましょう。

private static final String EXPECTED_STRING = "aaaaaaa";
private static final int N = 7;

したがって、 EXPECTED_STRING constantは、ソリューションで生成する必要のある文字列を表します。 N 定数は、文字の繰り返し回数を定義するために使用されます。

それでは、N個の繰り返し文字aの文字列を生成するためのオプションを調べてみましょう。

3. JDK11 String.repeat関数

Javaには、ソース文字列のコピーを作成するためのrepeat関数があります。

String newString = "a".repeat(N);
assertEquals(EXPECTED_STRING, newString);

これにより、1文字または複数文字の文字列を繰り返すことができます。

String newString = "-->".repeat(5);
assertEquals("-->-->-->-->-->", newString);

この背後にあるアルゴリズムは、ループを使用して文字の配列を非常に効率的に埋めます。

JDK11がない場合は、自分でアルゴリズムを作成するか、サードパーティのライブラリからアルゴリズムを使用する必要があります。 これらの最良のものは、JDK11ネイティブソリューションよりもはるかに高速または使いやすいとは考えられません。

4. 文字列を作成する一般的な方法

4.1. StringBuilder forループ付き

StringBuilderクラスから始めましょう。 for ループをN回繰り返し、繰り返される文字を追加します。

StringBuilder builder = new StringBuilder(N);
for (int i = 0; i < N; i++) {
    builder.append("a");
}
String newString = builder.toString();
assertEquals(EXPECTED_STRING, newString);

このアプローチでは、目的の文字列を取得します。 これはおそらく理解するのに最も簡単な方法ですが、実行時に必ずしも最速であるとは限りません

4.2. charアレイとforループ

固定サイズのchar配列に目的の文字を入力し、それを文字列に変換できます。

char[] charArray = new char[N];
for (int i = 0; i < N; i++) {
    charArray[i] = 'a';
}
String newString = new String(charArray);
assertEquals(EXPECTED_STRING, newString);

文字列を構築するときに文字列を格納するために動的なサイズの構造を必要とせず、Javaは char配列をStringに効率的に変換できるため、これはより高速であるはずです。

4.3. 配列fillメソッド

ループを使用する代わりに、ライブラリ関数を使用して配列を埋めることができます。

char charToAppend = 'a';
char[] charArray = new char[N];
Arrays.fill(charArray, charToAppend);
String newString = new String(charArray);
assertEquals(EXPECTED_STRING, newString);

これは以前のソリューションと同じくらい短く、実行時に効率的です。

5. repeatメソッドを使用した文字列の生成

5.1. Apacheリピートメソッド

このソリューションでは、ApacheCommonsライブラリの新しい依存関係を追加する必要があります。

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.12.0</version>
</dependency>

この依存関係を追加した後、StringUtilsクラスのrepeatメソッドを使用できます。 繰り返しの文字とその文字を繰り返す回数をパラメータとして取ります

char charToAppend = 'a';
String newString = StringUtils.repeat(charToAppend, N);
assertEquals(EXPECTED_STRING, newString);

5.2. グアバリピートメソッド

前のアプローチと同様に、これにはGuavaライブラリの新しい依存関係が必要です。

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>31.0.1-jre</version>
</dependency>

別のライブラリからのものであるという事実を除けば、このソリューションはApacheCommonsのソリューションと同じです。

String charToAppend = "a";
String newString = Strings.repeat(charToAppend, N);
assertEquals(EXPECTED_STRING, newString);

6. nCopiesメソッドを使用した文字列の生成

ターゲット文字列を繰り返されるサブ文字列のコレクションと考える場合、 List ユーティリティを使用してリストを作成し、結果のリストを最終的なStringに変換できます。 このために、java.utilパッケージのCollectionsクラスのnCopiesメソッドを使用できます。

public static <T> List<T> nCopies(int n, T o);

サブストリングのリストを作成することは、文字の固定配列を使用するソリューションよりも効果的ではありませんが、単一の文字だけでなく、文字のパターンを繰り返すと役立つ場合があります。

6.1. String joinおよびnCopiesメソッド

nCopies メソッドを使用して単一文字列のリストを作成し、String.joinを使用して結果に変換してみましょう。

String charToAppend = "a";
String newString = String.join("", Collections.nCopies(N, charToAppend));
assertEquals(EXPECTED_STRING, newString);

String.join メソッドには区切り文字が必要であり、空の文字列を使用しています。

6.2. Guava JoinerおよびnCopiesメソッド

Guavaは、代替の文字列ジョイナーを提供しています。これは、次のものも使用できます。

String charToAppend = "a";
String newString = Joiner.on("").join(Collections.nCopies(N, charToAppend));
assertEquals(EXPECTED_STRING, newString);

7. Streamgenerateメソッドを使用したStringの生成

サブ文字列のリストを作成することの欠点は、最終的な文字列を作成する前に、潜在的に大きな一時リストオブジェクトを作成することです。

ただし、Java 8以降、 StreamAPIからgenerateメソッドを使用できます。 limitメソッド(長さを定義するため)およびcollectメソッドと組み合わせて、N個の繰り返し文字の文字列を生成できます

String charToAppend = "a";
String newString = generate(() -> charToAppend)
  .limit(length)
  .collect(Collectors.joining());
assertEquals(exampleString, newString);

8. ApacheのRandomStringUtilsを使用したStringの生成

Apache CommonsライブラリのRandomStringUtilsクラスを使用すると、ランダムメソッドを使用してN個の繰り返し文字の文字列を生成できます。 文字と繰り返し回数を定義する必要があります。

String charToAppend = "a";
String newString = RandomStringUtils.random(N, charToAppend);
assertEquals(EXPECTED_STRING, newString);

9. 結論

この記事では、N個の繰り返し文字の文字列を生成するためのさまざまなソリューションを見ました。 これらの中で最も簡単なのはString.repeatで、JDK11以降から入手できます。

以前のバージョンのJavaには、他にも多くの可能なオプションがあります。 最適な選択は、実行時の効率、コーディングの容易さ、およびライブラリの可用性に関する要件によって異なります。

いつものように、これらの例のコードはGitHubから入手できます。