>  기사  >  백엔드 개발  >  Golang에서 sort.Strings()를 사용하여 대소문자를 구분하지 않는 정렬을 수행하는 방법은 무엇입니까?

Golang에서 sort.Strings()를 사용하여 대소문자를 구분하지 않는 정렬을 수행하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-10-31 04:25:01690검색

How to Achieve Case-Insensitive Sorting with sort.Strings() in Golang?

Golang에서 sort.Strings()를 사용한 대소문자 구분 없는 정렬

Go에서 sort.Strings() 함수는 간단하고 문자열 조각을 정렬하는 다용도 도구입니다. 그러나 기본적으로 정렬 순서는 대소문자를 구분합니다. 대소문자를 구분하지 않는 정렬을 수행하려면 사용자 정의 비교 함수를 제공해야 합니다.

Python Equivalent

Python에서는 다음을 사용하여 대소문자를 구분하지 않는 정렬을 수행할 수 있습니다. 다음 코드에 표시된 대로 sorted() 함수의 주요 매개변수입니다.

<code class="python">li = sorted(data, key=lambda s: s.lower())</code>

Go 구현

Go에서 이 Python 코드와 동등한 결과를 얻을 수 있습니다. sort.Slice() 및 사용자 정의 less 함수 사용:

<code class="go">sort.Slice(data, func(i, j int) bool { return strings.ToLower(data[i]) < strings.ToLower(data[j]) })</code>

이 코드는 data라는 새 슬라이스를 생성하고 제공된 less 함수를 사용하여 정렬합니다. less 함수는 인덱스 i와 j에 있는 문자열의 소문자 버전을 비교합니다. 이렇게 하면 동일한 소문자 표현을 가진 문자열이 동일한 것으로 간주됩니다.

룬 기반 비교

위 접근 방식은 작은 목록에는 작동하지만 큰 목록에는 비효율적일 수 있습니다. 각 비교에 대해 새 문자열이 할당되기 때문입니다. 이를 최적화하기 위해 문자열을 룬별로 비교할 수 있습니다.

<code class="go">func lessLower(sa, sb string) bool {
    for {
        rb, nb := utf8.DecodeRuneInString(sb)
        if nb == 0 {
            return false
        }

        ra, na := utf8.DecodeRuneInString(sa)
        if na == 0 {
            return true
        }

        rb = unicode.ToLower(rb)
        ra = unicode.ToLower(ra)

        if ra != rb {
            return ra < rb
        }

        // Trim rune from the beginning of each string.
        sa = sa[na:]
        sb = sb[nb:]
    }
}
⋮
sort.Slice(data, func(i, j int) bool { return lessLower(data[i], data[j]) })</code>

이 코드는 각 문자열에 있는 룬의 소문자 버전을 비교하고 첫 번째 문자열의 소문자 버전이 다음 문자열의 소문자 버전보다 작으면 true를 반환합니다. 두 번째 문자열입니다.

언어 인식 정렬

위 접근 방식은 대소문자를 구분하지 않는 정렬을 제공하지만 언어 또는 문화별 규칙을 고려하지 않습니다. 이러한 시나리오의 경우 로캘 인식 정렬을 위한 collate 패키지를 참조하세요.

위 내용은 Golang에서 sort.Strings()를 사용하여 대소문자를 구분하지 않는 정렬을 수행하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.