첫 번째 문자를 소문자로 만드는 가장 방법은 무엇입니까?
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
점수는 초당 작업이며 많을수록 좋습니다.
테스트
test1
Andy와 Hllink의 첫 번째 접근 방식 :string = Character.toLowerCase(string.charAt(0)) + string.substring(1);
test2
두 번째 Andy의 접근 방식. Daniel 도 제안하지 않았습니다 . 첫 번째 는 테스트 가정 때문에 제거되었습니다. 두 번째는 정확성을 위반했기 때문에 제거되었습니다 (예 : 입력 입력 이를 반환 함 ). 이것은 거의 가장 빠 사용합니다.Introspector.decapitalize()
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] |= ' '
Mike의 의견 에서 성능을 제공했습니다.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
두 번의substring()
통화를 사용했습니다 .string = string.substring(0, 1).toLowerCase() + string.substring(1);
test6
리플렉션을 사용 하여 String에서 직접 변경 합니다. 이것은 가장 느 렸습니다.char value[]
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"));
문자열 조작에 관해서는 Jakarta Commons Lang StringUtils를 살펴보십시오 .
Apache Commons를 사용하려면 다음을 수행 할 수 있습니다.
import org.apache.commons.lang3.text.WordUtils;
[...]
String s = "SomeString";
String firstLower = WordUtils.uncapitalize(s);
결과 : someString
char 지향 접근 방식에도 불구하고 String 지향 솔루션을 제안합니다. String.toLowerCase 는 로케일에 따라 다르 므로이 문제를 고려해야합니다. Character.toLowerCaseString.toLowerCase
에 따라 소문자를 선호하는 것입니다 . 또한 문자 지향 솔루션은 Character.toLowerCase 가 보충 문자를 처리 할 수 없기 때문에 완전한 유니 코드와 호환 되지 않습니다.
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")));
두 가지 다른 결과를 출력합니다.
나는
나는
Java의 문자열은 변경할 수 없으므로 어느 쪽이든 새 문자열이 생성됩니다.
첫 번째 예제는 임시 문자 배열이 아닌 새 문자열 만 생성하면되므로 약간 더 효율적일 것입니다.
원하는 것을 보관하는 매우 짧고 간단한 정적 방법 :
public static String decapitalizeString(String string) {
return string == null || string.isEmpty() ? "" : Character.toLowerCase(string.charAt(0)) + string.substring(1);
}
필요한 것이 매우 간단한 경우 (예 : 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 문자열 조작의 철학을 더 잘 이해하려면 이 위키 페이지를 확인 하세요 .
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 이후
val str = "Hello"
s"${str.head.toLower}${str.tail}"
결과:
res4: String = hello
'IT' 카테고리의 다른 글
selectMatch에서 각도 ui-bootstrap typeahead 복수? (0) | 2020.08.31 |
---|---|
Kotlin의 키워드는 어떻게 작동하나요? (0) | 2020.08.31 |
클래스의 인스턴스 메서드 목록 가져 오기 (0) | 2020.08.31 |
JSON.Net 자체 참조 루프 감지 (0) | 2020.08.31 |
Laravel- 요청시 세션 저장소가 설정되지 않음 (0) | 2020.08.31 |