programing

크기를 확인하거나 범위를 벗어나지 않고 문자열의 첫 번째 n자를 가져오려면 어떻게 해야 합니까?

javaba 2022. 7. 5. 23:54
반응형

크기를 확인하거나 범위를 벗어나지 않고 문자열의 첫 번째 n자를 가져오려면 어떻게 해야 합니까?

어떻게 하면 첫 번째에 도달할 수 있을까요?n크기 체크를 먼저 하지 않거나(인라인은 허용 가능), 또는 위험성이 없는 Java 문자열의 문자IndexOutOfBoundsException?

다음은 깔끔한 해결책입니다.

String upToNCharacters = s.substring(0, Math.min(s.length(), n));

의견: 이 솔루션은 「신기」하지만, 실제로는, 사용하는 솔루션보다 읽기 어렵다고 생각합니다.if/else뻔한 방법으로.만약 독자가 이 트릭을 보지 못했다면, 그/그녀는 코드를 이해하기 위해 더 많은 생각을 해야 한다.IMO, 코드의 의미는 더 명확합니다.if/else버전입니다.보다 깔끔하고 읽기 쉬운 솔루션에 대해서는 @paxdiablo의 답변을 참조하십시오.

바퀴를 재발명하지 말고...:

org.apache.commons.lang.StringUtils.substring(String s, int start, int len)

Javadoc의 설명:

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"

Apache Commons Lang에는 방법이 있습니다.

String upToNCharacters = StringUtils.left(s, n);
String upToNCharacters = String.format("%."+ n +"s", str);

끔찍하다n는 변수입니다(따라서 형식 문자열을 작성해야 합니다).단, 상수가 있는 경우는 매우 명확합니다.

String upToNCharacters = String.format("%.10s", str);

문서

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);

이것은, 많은 스트링 구축 작업을 실시할 때, 코드의 흐름을 끊지 않고(다른 회답에 대한 코멘트에 근거해) 고민하고 있는 경우에 유효합니다.

다음과 같이 서브스트링 방식을 사용합니다.

int n = 8;
String s = "Hello, World!";
System.out.println(s.substring(0,n);

n이 문자열 길이보다 클 경우 한 코멘트가 지적한 바와 같이 예외가 발생합니다.한 가지 간단한 해결책은 이 모든 것을 그 상태로 포장하는 것이다.if(s.length()<n)당신의 안에서else절에서는 String 전체를 인쇄/반환할지 아니면 다른 방법으로 처리할지를 선택할 수 있습니다.

Apache Commons는 나를 놀라게 했다.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;
}

언급URL : https://stackoverflow.com/questions/1583940/how-do-i-get-the-first-n-characters-of-a-string-without-checking-the-size-or-goi

반응형