>  기사  >  백엔드 개발  >  `sort.Slice` 순서가 정의되지 않았습니다.

`sort.Slice` 순서가 정의되지 않았습니다.

王林
王林앞으로
2024-02-10 12:12:101098검색

`sort.Slice` 顺序是不确定的

php 편집기 Strawberry는 `sort.Slice` 기능에 대한 몇 가지 중요한 정보를 소개합니다. Go 언어에서는 'sort.Slice' 함수를 사용하여 슬라이스를 정렬하지만, 정렬된 결과의 순서는 정의되지 않습니다. 즉, 동일한 입력 슬라이스에 대해 정렬 결과가 매번 다를 수 있습니다. 이는 `sort.Slice` 함수가 빠르고 효율적인 정렬 알고리즘을 사용하지만 구체적인 정렬 순서는 입력 데이터의 특정 조건에 따라 결정되기 때문입니다. 따라서 `sort.Slice` 함수를 사용할 때 특정 정렬 순서에 의존하는 시나리오에서 문제를 피하기 위해 정렬 결과의 비결정성을 알고 있어야 합니다.

질문 내용

go 표준 라이브러리의 sort.slice 对字符串切片进行排序。我希望它们按字母顺序排序,除了我希望空字符串出现在所有其他字符串之后(因此我不能只使用 sort.strings)을 사용하려고 합니다.

기능이 적다면 다음이 효과가 있을 것 같습니다.

으아악

단, 응모순서에 따라 무작위로 답변을 드리는 것 같습니다. 입니다:

으아악

이것은 몇 번 실행한 결과입니다:

func(i, j int) bool {
    return s[j] == "" || s[i] < s[j]
}

해결 방법

이는 less() 함수가 원하는 것을 말하지 않기 때문입니다.

비어 있지 않은 모든 문자열 다음에 빈 문자열을 정렬하고 싶다고 말씀하셨습니다. 당신의 논리:

으아악

이것은 두 번째 항목이 다른 항목보다 "",那么第一个就更少。这或多或少是正确的(除非两者都是空的,“is-less”并不是真的:它们是相等的)。但是,如果第一个是 "" 而第二个不是怎么办?那么你的函数应该返回 false 但它返回 s[i] < s[j]。如果第二个不为空,则为 true,告诉 "" 작은지 알려줍니다. 이는 원하는 것과 정반대입니다.

올바른 "is-less" 관계는 다음과 같습니다.

으아악

두 번째만 ""인 경우 첫 번째가 더 적기를 원합니다. 첫 번째 항목만 비어 있으면 "다음 이상"이 되기를 원합니다. 그렇지 않으면 일반 순서(바이트별)가 사용됩니다.

go 놀이터에서 사용해 보세요.

첫 번째 값과 두 번째 값이 모두 비어 있으면 false,因为 "" 不小于 "" (它们相等)。这是要返回的正确值,尽管在此处返回 true

보다 작지 않기 때문에 이 함수는 false를 반환합니다(동일함). 반환할 올바른 값입니다. 여기서 true를 반환하면 여전히 올바른 순서가 적용되지만(빈 요소를 교체하면 동일한 결과가 발생함) 교체 횟수가 줄어들 수 있습니다.

xor 변환 논리 사용

커스텀 로직에서는 하나의 문자열만 비어 있으면 정상적인 순서에서 벗어나게 됩니다. 이것이 논리적 XOR(XOR) 관계a xor btrue 如果只有 a 或只有 btrue。在 go 中,没有逻辑 xor 运算符,但 a xor b 相当于 a != b입니다:

.

true(否则为 false빈 문자열이 "감지"된 경우 결과는

(두 번째 빈 문자열이 비어 있는 경우)입니다. 따라서 우리는 이 신원 변환을 논리에 적용할 수 있습니다.

으아악 이것은 더 짧고 더 효율적일 수 있지만 보시다시피 이해하기가 더 어렵습니다. 성능이 중요한 경우에만 이 옵션을 사용하십시오. go 놀이터

에서 사용해 보세요. 🎜

위 내용은 `sort.Slice` 순서가 정의되지 않았습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제