String의 첫 번째 문자를 소문자로 만드는 가장 효율적인 방법?
의 첫 번째 캐릭터를 만드는 가장 효율적인 방법은 무엇입니까?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
점수는 초당 연산수(Operations per second)로 많을수록 좋습니다.
테스트
test1
앤디와 핼링크의 첫 번째 접근이었습니다.string = Character.toLowerCase(string.charAt(0)) + string.substring(1);
test2
앤디의 두번째 접근이었습니다.대니얼이 제안했지만, 두 개만 제안했습니다.if
진술들.첫번째if
테스트 가정 때문에 제거되었습니다.두 번째 것은 정확성을 위반했기 때문에 제거되었습니다(즉, 입력)."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
는 리플렉션을 사용하여 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
.
서드파티 라이브러리를 사용하고 싶지 않다면 좋은 대안을 찾았습니다.
import java.beans.Introspector;
Assert.assertEquals("someInputString", Introspector.decapitalize("SomeInputString"));
문자열 조작에 관해서는 자카르타 Commons Lang String Utils를 참조하십시오.
Apache Commons를 사용하려면 다음을 수행할 수 있습니다.
import org.apache.commons.lang3.text.WordUtils;
[...]
String s = "SomeString";
String firstLower = WordUtils.uncapitalize(s);
결과: some String
문자 지향적인 접근법에도 불구하고 String 지향적인 솔루션을 제안합니다.String.toLowerCase는 로케일 고유하기 때문에 이 문제를 고려하겠습니다. String.toLowerCase
는 Character.toLowerCase에 따른 소문자를 사용하는 것을 선호합니다.또한 Character.toLowerCase는 보조 문자를 처리할 수 없기 때문에 char 지향 솔루션은 완전한 Unicode와 호환되지 않습니다.
public static final String uncapitalize(final String originalStr,
final Locale locale) {
final int splitIndex = 1;
final String result;
if (originalStr.isEmpty()) {
result = originalStr;
} else {
final String first = originalStr.substring(0, splitIndex).toLowerCase(
locale);
final String rest = originalStr.substring(splitIndex);
final StringBuilder uncapStr = new StringBuilder(first).append(rest);
result = uncapStr.toString();
}
return result;
}
업데이트: 로케일 설정의 중요도를 나타내는 예로서 소문자를 사용합니다.I
다음 중 하나:
System.out.println(uncapitalize("I", new Locale("TR","tr")));
System.out.println(uncapitalize("I", new Locale("DE","de")));
는, 다음의 2개의 다른 결과를 출력합니다.
ı
i
Java의 문자열은 불변하기 때문에 어느 쪽이든 새로운 문자열이 생성됩니다.
첫 번째 예시는 임시 문자 배열이 아닌 새로운 문자열을 작성하기만 하면 되기 때문에 약간 더 효율적일 수 있습니다.
필요한 것을 아카이브하기 위한 매우 짧고 간단한 정적 방법:
public static String decapitalizeString(String string) {
return string == null || string.isEmpty() ? "" : Character.toLowerCase(string.charAt(0)) + string.substring(1);
}
val str = "Hello"
s"${str.head.toLower}${str.tail}"
결과:
res4: String = hello
필요한 것이 매우 간단한 경우(예: Java 클래스 이름, 로케일 없음) Google Guava 라이브러리에서 CaseFormat 클래스를 사용할 수도 있습니다.
String converted = CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_CAMEL, "FooBar");
assertEquals("fooBar", converted);
또는 보다 효율적인 변환기 개체를 준비하고 재사용할 수 있습니다.
Converter<String, String> converter=
CaseFormat.UPPER_CAMEL.converterTo(CaseFormat.LOWER_CAMEL);
assertEquals("fooBar", converter.convert("FooBar"));
Google Guava 문자열 조작의 철학을 더 잘 이해하려면 이 Wiki 페이지를 확인하십시오.
String testString = "SomeInputString";
String firstLetter = testString.substring(0,1).toLowerCase();
String restLetters = testString.substring(1);
String resultString = firstLetter + restLetters;
나는 오늘에야 이것을 알게 되었다.가장 평범한 방법으로 직접 해보려고 했어요.한 줄이나 걸렸는데, 너무 길었어갑시다.
String str = "TaxoRank";
System.out.println(" Before str = " + str);
str = str.replaceFirst(str.substring(0,1), str.substring(0,1).toLowerCase());
System.out.println(" After str = " + str);
제공 내용:
str = TaxoRanks 이전
str = taxoRanks 이후
언급URL : https://stackoverflow.com/questions/4052840/most-efficient-way-to-make-the-first-character-of-a-string-lower-case
'programing' 카테고리의 다른 글
스태틱과Java에서의 다이내믹바인딩 (0) | 2022.10.06 |
---|---|
스프링: 명령줄에서 하나의 application.property를 덮어씁니다. (0) | 2022.10.06 |
통화 형식으로 소수점 형식을 지정하려면 어떻게 해야 합니까? (0) | 2022.10.06 |
Nuxt.js SSR용 Apollo를 사용한 API 데이터 프리페치 (0) | 2022.10.06 |
치명적인 오류:메모리는 부족하지만 메모리는 충분히 있다(PHP) (0) | 2022.10.06 |