を使用するstream.collect(Collectors.joining(", "))
を使用すると、ストリームのすべての文字列をカンマで区切って簡単に追加できます。可能な結果は"a, b, c"
です。しかし、もし私が最後の区切り文字を異なるものにしたいのであればどうでしょうか?例えば、結果として"a, b and c"
が得られるように、" and "
になるようにしてください。簡単な解決法はありますか? stream.collect(Collectors.joining(", "))
:最後の区切り文字が異なる文字列を結合する
答えて
は、残りのすべての文字列と、あなたの質問に使用されるコードを使用して、この新しい文字列に参加その後stream.collect(Collectors.joining(" and "))
で最初の最後の2列に参加してみます。
すでにリストに入っている場合、ストリームは必要ありません。単純にすべてのサブリストが、最後の要素に参加して、他の区切り文字と最後の要素をCONCAT:
int last = list.size() - 1;
String joined = String.join(" and ",
String.join(", ", list.subList(0, last)),
list.get(last));
ここCollectors.collectingAndThen:
stream.collect(Collectors.collectingAndThen(Collectors.toList(),
joiningLastDelimiter(", ", " and ")));
public static Function<List<String>, String> joiningLastDelimiter(
String delimiter, String lastDelimiter) {
return list -> {
int last = list.size() - 1;
if (last < 1) return String.join(delimiter, list);
return String.join(lastDelimiter,
String.join(delimiter, list.subList(0, last)),
list.get(last));
};
}
を使用して、上記のこのバージョンはまた、ケースを扱うことができないバージョンがありますストリームが空であるか、値が1つしかない場合。 HolgerとAndreasのおかげで、このソリューションが大幅に改善されました。
私はオックスフォードのカンマが区切り文字として", "
と", and"
を使用してこれを達成することができることをコメントで示唆していたが、それは二つの要素のための"a, and b"
の誤った結果が得られ、その楽しみのためだけにここに正しくオックスフォードカンマがないものがあります:
stream.collect(Collectors.collectingAndThen(Collectors.toList(),
joiningOxfordComma()));
public static Function<List<String>, String> joiningOxfordComma() {
return list -> {
int last = list.size() - 1;
if (last < 1) return String.join("", list);
if (last == 1) return String.join(" and ", list);
return String.join(", and ",
String.join(", ", list.subList(0, last)),
list.get(last));
};
}
String str = "a , b , c , d";
String what_you_want = str.substring(0, str.lastIndexOf(","))
+ str.substring(str.lastIndexOf(",")).replace(",", "and");
// what_you_want is : a , b , c and d
あなたは"a, b, and c"
と罰金であれば、それは追加の操作で、標準のストリームAPIを拡張して、私のStreamExライブラリのmapLast
方法を使用することも可能です:
String result = StreamEx.of("a", "b", "c")
.mapLast("and "::concat)
.joining(", "); // "a, b, and c"
mapLast
方法は変わらず他人を保ち、最後のストリーム要素へのマッピングを与えられ適用されます。私も同じようなものがありますunit-test。
これはOPが望む答えではありませんが、あなたがオックスフォードカンマのファンであれば、この答えは文法的に「もっと」正しいものになります(返信文の場合は、(0、最後))、list.get(last)) 'ありがとうTagir。 –
古いJavaソリューションをお探しの場合は、Guava librariesを使用すると簡単です。
List<String> values = Arrays.asList("a", "b", "c");
String output = Joiner.on(",").join(values);
output = output.substring(0, output.lastIndexOf(","))+" and "+values.get(values.size()-1);
System.out.println(output);//a,b and c
List<String> names = Arrays.asList("Thomas", "Pierre", "Yussef", "Rick");
int length = names.size();
String result = IntStream.range(0, length - 1).mapToObj(i -> {
if (i == length - 2) {
return names.get(i) + " and " + names.get(length - 1);
} else {
return names.get(i);
}
}).collect(Collectors.joining(", "));
- 1. 電子メール文字列を区切り文字で区切る
- 2. 複数の区切り文字で区切る文字列
- 3. 区切り文字なしの文字列をカンマ区切りの文字列に変換する方法は?
- 4. 文字フィールドの最後の区切り文字AWK
- 5. JavaScript文字列区切り文字
- 6. クエリ文字列区切り文字
- 7. 分割文字列区切り文字
- 8. 文字列内の異なるデータを区切ります
- 9. Python文字列の最後の区切り文字で分割しますか?
- 10. 隣の区切り文字で区切られた文字列
- 11. カンマ区切り文字列
- 12. スプリットカンマ区切り文字列
- 13. bash:区切り文字付きの区切り文字で区切られているが、括弧で囲まれた文字列ではない場合は
- 14. 異なる区切りで文字列を爆発例えば、()
- 15. 区切り文字列でのOracleの結合
- 16. パイプ文字区切り文字でフィールドを区切る方法
- 17. PHP;区切り文字と区切り文字の間の文字列を削除する方法は?
- 18. PHP文字列のスマートな文字列区切り
- 19. 文字列をCの区切り文字なしの文字列に分割
- 20. リピートパターンの文字列を保持区切り文字で区切る
- 21. 文字列と数字の区切り
- 22. 文字列区切り文字がnullの場合でも文字列値をキャメルにする方法は?
- 23. 最初の特殊文字の後の文字列を区切り文字として分割します。
- 24. 最後の区切り文字が見つかるまで文字列を保存する - C
- 25. 区切り文字で文字列を検索するファイル
- 26. Haskell - 区切り文字で文字列を分割する
- 27. boost :: tokenizerを文字列区切り文字で使用する
- 28. Mysqlクエリ... WHERE(コンマ区切り文字列)IN(カンマ区切り文字列)
- 29. foreachの最後に区切り文字がありません
- 30. 区切り文字を区切り文字として使用
正直に言うと - いいえ、ありません。 'Collectors.joining'は、このようなことをしようとすると完全に分解するかなり面倒なトリックを使います。 –
独自の['Collector'](https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collector.html)を実装してください。 「簡単」に関しては、それは技術と意見の問題です。 – Andreas
@Andreasこのようなコレクターを実装することは可能ですか?コレクタは特別な区切り文字をいつ使用するのかを知っていますか? –