[解決済み] 文字列の最初の文字を小文字にする最も効率的な方法とは?
質問
の最初の文字を、"co" とする最も効率的な方法は何でしょうか?
String
の最初の文字を小文字にする最も効率的な方法は何ですか?
いろいろな方法が考えられますね。
を使う
charAt()
と
substring()
String input = "SomeInputString";
String output = Character.toLowerCase(input.charAt(0)) +
(input.length() > 1 ? input.substring(1) : "");
を使うか
char
配列
String input = "SomeInputString";
char c[] = input.toCharArray();
c[0] = Character.toLowerCase(c[0]);
String output = new String(c);
他にも素晴らしい方法がたくさんあると思います。お勧めの方法は何ですか?
どのように解決するのですか?
私は、有望なアプローチを JMH . 完全なベンチマーク コード .
テスト中の仮定(毎回コーナーケースをチェックするのを避けるため):入力文字列の長さは常に1より大きい。
結果
Benchmark Mode Cnt Score Error Units
MyBenchmark.test1 thrpt 20 10463220.493 ± 288805.068 ops/s
MyBenchmark.test2 thrpt 20 14730158.709 ± 530444.444 ops/s
MyBenchmark.test3 thrpt 20 16079551.751 ± 56884.357 ops/s
MyBenchmark.test4 thrpt 20 9762578.446 ± 584316.582 ops/s
MyBenchmark.test5 thrpt 20 6093216.066 ± 180062.872 ops/s
MyBenchmark.test6 thrpt 20 2104102.578 ± 18705.805 ops/s
スコアは1秒あたりの演算量であり、多ければ多いほど良い。
テスト
-
test1
は、まずAndyとHllinkのアプローチでした。string = Character.toLowerCase(string.charAt(0)) + string.substring(1);
-
test2
は、2番目のアンディのアプローチでした。それはまたIntrospector.decapitalize()
は Daniel によって提案されましたが、2 つのif
ステートメントがありません。まずif
はテストの前提のために削除されました。2つ目は正しさに違反するため削除されました(つまり入力の"HI"
を入力すると"HI"
). これはほとんど最速でした。char c[] = string.toCharArray(); c[0] = Character.toLowerCase(c[0]); string = new String(c);
-
test3
はtest2
を修正したものですが、代わりにCharacter.toLowerCase()
の代わりに32を追加していましたが、これは文字列がASCIIである場合にのみ正しく動作します。これは最速でした。c[0] |= ' '
をマイクの コメント は同じ性能を与えました。char c[] = string.toCharArray(); c[0] += 32; string = new String(c);
-
test4
中古StringBuilder
.StringBuilder sb = new StringBuilder(string); sb.setCharAt(0, Character.toLowerCase(sb.charAt(0))); string = sb.toString();
-
test5
2つのsubstring()
の呼び出しがあります。string = string.substring(0, 1).toLowerCase() + string.substring(1);
-
test6
を変更するためにリフレクションを使用します。char value[]
を直接Stringで変更します。これが一番遅かったです。try { Field field = String.class.getDeclaredField("value"); field.setAccessible(true); char[] value = (char[]) field.get(string); value[0] = Character.toLowerCase(value[0]); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); }
結論
文字列の長さが常に0より大きい場合は
test2
.
そうでない場合は、コーナーケースを確認する必要があります。
public static String decapitalize(String string) {
if (string == null || string.length() == 0) {
return string;
}
char c[] = string.toCharArray();
c[0] = Character.toLowerCase(c[0]);
return new String(c);
}
テキストが常に ASCII であることが確実で、このコードがボトルネックになっているため、極端なパフォーマンスを求めているのであれば
test3
.
関連
-
unsigned char* から const jbyte* {aka const signed char*} への変換が無効です。
-
シェルコマンドやスクリプトのJavaコール
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] Bashで文字列を小文字に変換する方法は?
-
[解決済み] Javaで数値を小数点以下n桁に丸める方法
-
[解決済み] JavaScript の文字列をすべて小文字に変換する
-
[解決済み] Rubyで文字列を小文字・大文字に変換する方法
-
[解決済み] std::stringのインスタンスを小文字に変換する方法
-
[解決済み] 文字列の最初の文字を大文字にする(最大限のパフォーマンスを発揮する)
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Springの設定でxsdファイルのバージョン番号を設定しない方が良い理由
-
メモ帳でJavaプログラムをコンパイルして実行すると、Could not find or load main class ...というエラーが表示される。解決方法
-
Git Pull Failed マージされていないファイルがあるため、Pull できません。
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException:5 エラー
-
Java appears タイプEを囲むインスタンスがアクセスできない。
-
X11 DISPLAY変数が設定されていない」問題の解決方法
-
ecplise プロンプトが表示されます。"選択したものは起動できません。" "最近の起動はありません。"
-
Web Project JavaでPropertiesファイルを読み込むと、「指定されたファイルがシステムで見つかりません」というソリューションが表示されます。
-
アクセス制限の解決方法: ---- in Java
-
ApiModel と @ApiModelProperty の使用法