例に基づいて、Java8ストリームを使用して文字列内の一意の文字を検索する関数をコーディングしましたここに。
私にとって、それはかなり直感的ではありません。おそらく私はまだストリームを学んでいるからでしょう。これを読みやすくする方法はありますか?
コードは次のとおりです。
public static void main(String[] args) {
String str = "aabcddeffg";
char[] charArray = str.toCharArray();
List<String> strList = new ArrayList<>();
for(int i=0; i< charArray.length; i++){
String myChar = String.valueOf(charArray[i]);
strList.add(myChar);
}
Map<String, Long> myMap =
strList.stream().
collect(
Collectors.groupingBy(
Function.identity(),Collectors.counting()
)
);
myMap.forEach((k, v) -> {
if (v == 1) {
System.out.println(k);
}
});
}
}
回答 2 件
ここにそれを行うための1つのかなりあいまいな方法があります。
のストリームを作成します
0
にstring length
。ここで、i + 1で始まる文字列に、iで始まる文字が含まれているかどうかを確認します。含まれている場合は、重複している必要があります。
したがって、ストリームでインデックスを渡します。
次に、そのインデックスを実際の文字にマップします。
重複をすべて削除して、元の文字列のコピーを減らします。
String str = "aabcddeffg"; String result = IntStream.range(0,str.length()) .filter(i->str.substring(i+1) .indexOf(str.charAt(i)) >= 0 ) .mapToObj(i->str.substring(i,i+1)).reduce(str, (a,b)->a.replace(b,"")); System.out.println(result);
プリント
bceg
関連した質問
- ストリームJava8を使用してリストJavaで変更する
- マップに値が存在するかどうかを確認し、キーを返すか、例外をスローします
- 「Java8メソッドリファレンス」オブジェクトをストリームに渡すことは可能ですか?
- 複数のリストをストリーム内のオブジェクトの1つのリストにマージしますか?
- iteratorforEachRemainingを終了するためのより良い方法はありますか
- Java 8ストリームは、特定のオブジェクトをマップからリストにコピーします
- Javaストリームを使用して、プロパティに基づいて連続する要素のみをグループ化する
- 欠落しているIDのマップIDフィールドの2つのリストを比較するためのラムダ
- Javaのメソッド内に存在するクラスのオブジェクトを作成するにはどうすればよいですか?
- 複数のcsvファイルからIDと外部IDを取得する方法
実際の頻度を計算するために、あなたはすでにほとんど最小限の例にいます!
そして、単一の文字列に対してそれを行うために、それはさらに簡単です(あなたは変換を保存します):
そのために、私はあなたのコードが単に一貫性があり、読みやすいことを保証します。たとえば、一貫したインデントを使用して、ストリームが1行ごとにどのようにステップするかをコメントします。
編集:OPの参考のために、以下の(古い)回答を残しましたが、実際の質問には回答していません。
ええと、Stream#distinctは常にあります。
「個別」の計算(ユニーク)文字:
あなたがそれを集めるのを避けたいならば、あなたはタイプボクシングの周りのすべての面倒を避けることもできます: