먼저 n
크기 검사를 수행하지 않고 (인라인이 허용 가능) 또는 위험을 감수하지 않고 Java에서 문자열 의 첫 문자 를 어떻게 확인 IndexOutOfBoundsException
합니까?
먼저 n
크기 검사를 수행하지 않고 (인라인이 허용 가능) 또는 위험을 감수하지 않고 Java에서 문자열 의 첫 문자 를 어떻게 확인 IndexOutOfBoundsException
합니까?
답변:
깔끔한 해결책은 다음과 같습니다.
String upToNCharacters = s.substring(0, Math.min(s.length(), n));
의견 :이 솔루션은 "신선한"반면, / 를 명백한 방식으로 사용하는 솔루션보다 실제로 읽기 쉽지 않다고 생각합니다 . 독자가이 트릭을 보지 못했다 면 코드를 이해 하기 가 더 어려워 야 합니다. IMO, 코드의 의미는 / 버전 에서 더 분명합니다 . 더 깨끗하고 읽기 쉬운 솔루션은 @paxdiablo의 답변을 참조하십시오.if
else
if
else
바퀴를 재발 명하지 마십시오 ... :
org.apache.commons.lang.StringUtils.substring(String s, int start, int len)
자바 독 은 말한다 :
StringUtils.substring(null, *, *) = null StringUtils.substring("", * , *) = ""; StringUtils.substring("abc", 0, 2) = "ab" StringUtils.substring("abc", 2, 0) = "" StringUtils.substring("abc", 2, 4) = "c" StringUtils.substring("abc", 4, 6) = "" StringUtils.substring("abc", 2, 2) = "" StringUtils.substring("abc", -2, -1) = "b" StringUtils.substring("abc", -4, 2) = "ab"
그러므로:
StringUtils.substring("abc", 0, 4) = "abc"
StringUtils.substring(yourString, 0, n)
와 같지 않은 것을 지적하는 것도 유용 할 수 있습니다 yourString.substring(0, n)
. 전자는 from StringUtils
이고, 후자는 사용합니다 String.substring
(종료 인덱스가 문자열 길이를 초과하면 예외가 발생합니다).
if (end > str.length()) { end = str.length();}
StringUtils.substring(String s, int start, int len)
는 len이 아니며 끝 인덱스입니다.
Apache Commons Lang 에는이를위한 StringUtils.left
방법이 있습니다.
String upToNCharacters = StringUtils.left(s, n);
SO에 대한 질문의 클래스가 때로는 완벽하게 이해되지 않습니다. 이것은 위험에 가깝습니다 :-)
아마도 배제한 두 가지 방법 중 하나를 사용하여 혐오감을 설명 할 수있을 것입니다.
if
명령문이나 예외 잡기 코드로 코드를 작성 하지 않으려는 이유 중 하나는 다음과 같은 도우미 함수를 사용하는 것입니다.
static String substring_safe (String s, int start, int len) { ... }
미리 길이를 확인하고 그에 따라 행동합니다 (작은 줄이나 공백이있는 패드를 반환합니다).
그런 다음 코드에서 전혀 걱정할 필요가 없습니다.
String s2 = substring_safe (s, 10, 7);
대신에:
String s2 = s.substring (10,7);
이것은 많은 문자열 작성 작업을 수행 할 때 코드 흐름을 깨뜨리지 않고 (다른 답변에 대한 귀하의 의견을 바탕으로) 걱정되는 것처럼 작동합니다.
String upToNCharacters = String.format("%."+ n +"s", str);
if n
가 변수 인 경우 에는 끔찍 하지만 (따라서 형식 문자열을 구성해야 함) 상수 인 경우에는 분명합니다.
String upToNCharacters = String.format("%.10s", str);
다음과 같이 부분 문자열 방법을 사용하십시오.
int n = 8;
String s = "Hello, World!";
System.out.println(s.substring(0,n);
n이 문자열의 길이보다 크면 한 주석 작성자가 지적한 것처럼 예외가 발생합니다. 하나 개의 간단한 솔루션은 상태에서이 모든 것을 래핑하는 것입니다 if(s.length()<n)
귀하의 else
절, 당신은 단지 / 인쇄 전체 문자열을 반환하거나 다른 방법을 처리할지 여부를 선택할 수 있습니다.
Kotlin으로 개발하기에 운이 좋으면 목표를 달성
하는 take
데 사용할 수 있습니다 .
val someString = "hello"
someString.take(10) // result is "hello"
someString.take(4) // result is "hell" )))
ApacheCommons
StringUtils.abbreviate(String str, int maxWidth)
는 "..."를 덧붙이고 접미사를 변경할 수있는 옵션이 없습니다.
WordUtils.abbreviate(String str, int lower, int upper, String appendToEnd)
다음 빈 공간을 찾습니다.
나는 이것을 여기에 남겨 둘 것입니다 :
public static String abbreviate(String s, int maxLength, String appendToEnd) {
String result = s;
appendToEnd = appendToEnd == null ? "" : appendToEnd;
if (maxLength >= appendToEnd.length()) {
if (s.length()>maxLength) {
result = s.substring(0, Math.min(s.length(), maxLength - appendToEnd.length())) + appendToEnd;
}
} else {
throw new StringIndexOutOfBoundsException("maxLength can not be smaller than appendToEnd parameter length.");
}
return result;
}