Java 8を使用して更新されたバージョン(投稿の最後にあるオリジナル)
使用できる要素をフィルタリングする必要がない場合
Java 8以降StringJoiner
、(最初に使用されたのではなくStringBulder
)コードを使用して簡略化できます。
また、" *"
の呼び出しごとに正規表現が再コンパイルされないようにするためmatches(" *")
に、コンパイルされたバージョンを一部のフィールドに保持し、必要に応じて使用する個別のパターンを作成できます。
private static final Pattern SPACES_OR_EMPTY = Pattern.compile(" *");
public static String implode(String separator, String... data) {
StringJoiner sb = new StringJoiner(separator);
for (String token : data) {
if (!SPACES_OR_EMPTY.matcher(token).matches()) {
sb.add(token);
}
}
return sb.toString();
}
ストリームを使用すると、コードは次のようになります。
private static final Predicate<String> IS_NOT_SPACES_ONLY =
Pattern.compile("^\\s*$").asPredicate().negate();
public static String implode(String delimiter, String... data) {
return Arrays.stream(data)
.filter(IS_NOT_SPACES_ONLY)
.collect(Collectors.joining(delimiter));
}
ストリームを使用する場合、filter
要素を使用できますPredicate
。この場合、述語がスペースだけではない文字列を受け入れるようにします。つまり、文字列には空白以外の文字が含まれている必要があります。
パターンからそのような述語を作成することができます。この方法で作成された述語は、正規表現と一致する可能性のあるサブ文字列を含むすべての文字列を受け入れます(したがって、正規表現が"\\S"
述語を検索する場合、、、、など"foo "
の文字列を受け入れますが、" foo bar "
または"whatever"
を受け入れ" "
ません" "
)。
だから私たちは使うことができます
Pattern.compile("\\S").asPredicate();
または、おそらくもう少し説明的な、スペースのみの文字列の否定、または空の文字列
Pattern.compile("^\\s*$").asPredicate().negate();
次に、filterがすべての空の、またはスペースのみを含む文字列を削除するときに、collect
残りの要素を削除できます。おかげでCollectors.joining
、使用する区切り文字を決定できます。
元の回答(Java 8より前)
public static String implode(String separator, String... data) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < data.length - 1; i++) {
//data.length - 1 => to not add separator at the end
if (!data[i].matches(" *")) {//empty string are ""; " "; " "; and so on
sb.append(data[i]);
sb.append(separator);
}
}
sb.append(data[data.length - 1].trim());
return sb.toString();
}
あなたはそれを次のように使うことができます
System.out.println(implode(", ", "ab", " ", "abs"));
また
System.out.println(implode(", ", new String[] { "ab", " ", "abs" }));
出力ab, abs