私は2つのセット - 国と州を持っています。私は両方からすべての可能な順列を作成したいと思います。複数の設定値から文字列の順列を生成する(Java 8ストリーム)
import java.util.*;
import java.util.stream.Collectors;
public class HelloWorld{
public static void main(String []args){
System.out.println("Hello World");
Set<String> countryPermutations = new HashSet<>(Arrays.asList("United States of america", "USA"));
Set<String> statePermutations = new HashSet<>(Arrays.asList("Texas", "TX"));
Set<String> stateCountryPermutations = countryPermutations.stream()
.flatMap(country -> statePermutations.stream()
.flatMap(state -> Stream.of(state + country, country + state)))
.collect(Collectors.toSet());
Set<String> finalAliases = Optional.ofNullable(stateCountryPermutations)
.map(Collection::stream).orElse(Stream.empty())
.map(sc -> "houston " + sc)
.collect(Collectors.toSet());
System.out.println(stateCountryPermutationAliases);
}
}
州または国または両方の置換はnullでもかまいません。私はまだ私のコードが機能するようにしたい。
要件
状態の順列がnullの場合、最終的な出力があるべき[ヒューストンアメリカ、アメリカのヒューストン米国]
国の順列がnullの場合、最終的な出力があるべき[ヒューストンTX 、テキサス州ヒューストン]
両方がnullの場合は、出力なし
は私が1 & 2が満たされていない、以下
Set<String> stateCountryPermutations =
Optional.ofNullable(countryPermutations)
.map(Collection::stream)
.orElse(Stream.empty())
.flatMap(country -> Optional.ofNullable(statePermutations)
.map(Collection::stream)
.orElse(Stream.empty())
.flatMap(state -> Stream.of(state + country, country + state)))
.collect(Collectors.toSet());
これを満たす3.いずれかの順列がnullに私のコードを変更しています。私は応答として別名を取得しません。コードを変更するにはどうすればよいですか?
私は最後のコードサンプルを試しましたが、どちらかまたは両方のセットがnull(または空)の場合、emtpy結果が得られます。つまり、3を満たすだけです。ストリーム、またはいくつかのカントリーストリームを空の**ストリームに、または**何も** **空の**ストリームに割り当てることができます。これを解決するには、「国なし」または「状態なし」のプレースホルダとしてnullオブジェクト(ヌル自体ではなく、空の文字列のようなもの)を導入できます。ストリームの前でチェックするだけで、入力セットを結果として使うことができます( '' if(countries == null)permutations = states; '')。 –
ありがとう@MalteHartwig、私のポストを更新しました。 –
簡単にするために、私は2つのセットを使用しました。私の実際のコードは4つのセットを通して順列変換が必要です。 if-elseがあまりにも厄介になる –