を使用する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. 文字フィールドの最後の区切り文字AWK
- 3. 文字列内の異なるデータを区切ります
- 4. Python文字列の最後の区切り文字で分割しますか?
- 5. カンマ区切り文字列
- 6. 異なる区切りで文字列を爆発例えば、()
- 7. パイプ文字区切り文字でフィールドを区切る方法
- 8. リピートパターンの文字列を保持区切り文字で区切る
- 9. Mysqlクエリ... WHERE(コンマ区切り文字列)IN(カンマ区切り文字列)
- 10. boost :: tokenizerを文字列区切り文字で使用する
- 11. 区切り文字で文字列を検索するファイル
- 12. 区切り文字なしでC#で文字列を文字列に分割
- 13. Python:区切り文字のリストで区切り文字
- 14. Unix:文字列を正規表現の区切り文字で切り取る
- 15. Javaの後置区切り文字
- 16. 文字列の区切り文字としてのWindowsバッチ文字列
- 17. TelerikグリッドASP.NET MVC2最後の列区切り文字がありません
- 18. 2つの異なるデリミタで区切られた文字列
- 19. リストボックスから文字列を区切る文字列をキャスト
- 20. コンマ区切り文字列を読む
- 21. Pythonでの文字列区切り
- 22. SQL解析の区切り文字列
- 23. カンマ区切りの文字列
- 24. クエリカンマ区切りの文字列
- 25. Ajaxレスポンスの文字列値の区切り文字
- 26. シェルで区切り文字として文字列を使用して文字列を切ります
- 27. 文字列から最後の4文字を切り取りますか?
- 28. UltraWingrid - 文字列に1000個の区切り文字
- 29. 文字列の最後の文字を大文字にする
- 30. 区切り文字で区切り文字を区切り、改行して印刷する
正直に言うと - いいえ、ありません。 'Collectors.joining'は、このようなことをしようとすると完全に分解するかなり面倒なトリックを使います。 –
独自の['Collector'](https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collector.html)を実装してください。 「簡単」に関しては、それは技術と意見の問題です。 – Andreas
@Andreasこのようなコレクターを実装することは可能ですか?コレクタは特別な区切り文字をいつ使用するのかを知っていますか? –