亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 golang 中對定長數組進行排序?

如何在 golang 中對定長數組進行排序?

Go
素胚勾勒不出你 2023-04-10 10:13:08
我有以下多元數組:x := [2][3]int{    {3, 2, 1},    {3, 2, 1},}行和列都是固定大小的。我正在嘗試檢查行是否已排序,并且我理解排序函數需要大小未知的數組。我怎樣才能要求 go 將已知大小的固定項目視為大小未知的項目?var allTrue bool = truefor i := range x {  t := sort.Ints(x[i]) == []int{1, 2, 3}  allTrue = allTrue && t}我得到:./main.go:xx:yy: sort.Ints(x[i]) used as value./main.go:xx:yy: cannot use x[i] (type [3]int) as type []int in argument to sort.Ints我是否正確閱讀此錯誤消息?
查看完整描述

3 回答

?
一只斗牛犬

TA貢獻1784條經驗 獲得超2個贊

解決代碼問題

如上所述,切片與數組具有不同的類型,因此您不能在需要[N]T某些類型的地方N使用某些類型的東西。T[]T

sort.Ints就地對整數切片進行排序——它具有類型簽名func Ints(a []int)。您的調用在 indexsort.Ints(x[i])索引數組?,這將返回一個 type 的數組。這與 sort 函數不兼容,會導致您觀察到的編譯時錯誤。xi[3]int

要從數組中獲取切片,可以使用切片表達式。這樣的表達式允許使用數組、切片和一些其他類型來構造新的切片。

切片表達式以以下形式給出,a[low : high]其中lowhigh是可選的整數,提供到支持數組或切片的索引,這些索引指定要在新切片中返回的范圍。上面的語言規范鏈接有更多詳細信息,我建議您閱讀;可以說a[:]一些數組或切片的最簡單切片表達式a是語法糖來表示a[0:len(a)-1],即將數組/切片轉換為相同長度的切片。

[]int使用這個技巧,通過切片從多維數組中獲取類型的切片x[i][:]

  • x[i][3]int像以前一樣返回類型為 的數組

  • 對返回的數組進行切片會返回類型為 的切片[]int,該切片與 兼容sort.Ints。


sort.Ints不返回值,切片不可比較

即使您用代碼解決了這些問題,以下行仍然存在兩個問題:

t?:=?sort.Ints(x[i])?==?[]int{1,?2,?3}
  1. sort.Ints就地排序;它不返回值,因此相等性測試沒有意義。

  2. sort.Ints對不可比較的切片進行操作。不可能調用A == Bwhere either?Aor?Bis a slice,除非 either?AorB是特殊標識符nil。這是語言規范中涵蓋的一個微妙點。(另外:閱讀那一頁,你會注意到數組可比較的。)

由于您無法使用相等運算符直接比較切片==,因此驗證切片的逐元素相等性需要:

  • 切片具有相同的長度(不同的長度意味著一個切片比另一個具有更多的元素)

  • 一個切片的每個索引處的元素與其他切片相同。

(我忽略了一個切片可能與另一個切片具有不同容量的事實,因為我們只關心元素方面的相等性。)

這可以通過遍歷其中一個切片并驗證每個索引處的元素對應于另一個切片中的相同索引來驗證。此示例代碼提供了一個示例:

package main


import (

? ? "fmt"

)


func CheckEquality(a, b []int) bool {

? ? // Slices of dissimilar length are not equal

? ? if len(a) != len(b) {

? ? ? ? return false

? ? }


? ? for i, el := range a {

? ? ? ? if b[i] != el {

? ? ? ? ? ? return false

? ? ? ? }

? ? }


? ? return true

}


func main() {

? ? var mySlice = []int{1, 2, 3, 4, 5}

? ? var mySlice2 = []int{1, 2, 3, 4, 5}? ?// same as mySlice

? ? var otherSlice = []int{5, 6, 7, 8, 9} // dissimilar slice

? ? var longSlice = []int{1, 2, 3, 4, 5, 6, 7, 8, 9}


? ? fmt.Println(CheckEquality(mySlice, mySlice2))? ?// Expect true

? ? fmt.Println(CheckEquality(mySlice, otherSlice)) // Expect false

? ? fmt.Println(CheckEquality(mySlice, longSlice))? // Expect false

}


查看完整回答
反對 回復 2023-04-10
?
紅顏莎娜

TA貢獻1842條經驗 獲得超13個贊

您必須先使用[:]運算符對數組進行切片,然后才能將其與sort包一起使用。

此外,您可以檢查切片的排序是否比排序更有效,使用sort.IntsAreSorted([]int), 就像這樣。

var allTrue bool = true

for i := range x {

? ? if !sort.IntsAreSorted(x[i][:]) {

? ? ? ? allTrue = false

? ? ? ? break

? ? }

}


查看完整回答
反對 回復 2023-04-10
?
慕仙森

TA貢獻1827條經驗 獲得超8個贊

您可以使用運算符從數組中獲取切片[:],例如:


arr := [3]int{1, 2, 3}

slc := arr[:] // []int{1, 2, 3}, backed by arr

因此,您可以使用以下sort.Ints(...)功能:


sort.Ints(x[0][:])

sort.Ints(x[1][:])

// Now both elements of "x" are sorted.


查看完整回答
反對 回復 2023-04-10
  • 3 回答
  • 0 關注
  • 200 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號