文字列内のさまざまな文字とその番号を取得する方法
この質問は 2 つのステップに分かれています。最初のステップはさまざまな文字を見つけることです。2 番目のステップは次のとおりです。ステップ 1、文字の数を数えます。ちょっとナンセンスだと思いませんか? まず答えを言わせてください。
public class DistinctCharsCount { public static void main(String[] args) { printDistinctCharsWithCount("itwanger"); printDistinctCharsWithCount("chenmowanger"); } private static void printDistinctCharsWithCount(String input) { Map<Character, Integer> charsWithCountMap = new LinkedHashMap<>(); for (char c : input.toCharArray()) { Integer oldValue = charsWithCountMap.get(c); int newValue = (oldValue == null) ? 1 : Integer.sum(oldValue, 1); charsWithCountMap.put(c, newValue); } System.out.println(charsWithCountMap); } }
プログラムの出力結果は次のとおりです:
{i=1, t=1, w=1, a=1, n=1, g=1, e=1, r=1} {c=1, h=1, e=2, n=2, m=1, o=1, w=1, a=1, g=1, r=1}
私のアイデアについてお話します:
1) LinkedHashMap を宣言するか、HashMap を使用できますが、前者は文字列を分割したままにすることができます。注文を分割した後、結果が一目でより明確に見えます。
Map を使用する理由は? Map のキーは繰り返すことが許可されておらず、繰り返された文字の数を蓄積するだけだからです。
2) 文字列を文字に分割し、トラバースします。
3) キーが null の場合、その番号は 1 であることを意味します。それ以外の場合は、前の値に 1 を加算してマップに戻し、前の文字数を上書きします。
その考え方は非常に明快ですよね?思わず拍手を送りたくなります。
そうですね、JDK 8 以降、Map には一度に複数のキーに値を割り当てる非常に強力なメソッド merge() が追加されました:
private static void printDistinctCharsWithCountMerge(String input) { Map<Character, Integer> charsWithCountMap = new LinkedHashMap<>(); for (char c : input.toCharArray()) { charsWithCountMap.merge(c, 1, Integer::sum); } System.out.println(charsWithCountMap); }
これは非常に強力ですか? 次のコマンドで実行できます。コードは 1 行です。最初のパラメータはキー、2 番目のパラメータは値、3 番目のパラメータは BiFunction です。つまり、キーがすでに存在する場合は、BiFunction に基づいて新しい値を再計算します。
文字が初めて出現する場合は、値を 1 に割り当てます。それ以外の場合は、前の値の合計を 1 に割り当てます。
以上がJavaで文字列内のさまざまな文字とその番号を取得する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。