第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

如何在 golang 中對定長數(shù)組進行排序?

如何在 golang 中對定長數(shù)組進行排序?

Go
素胚勾勒不出你 2023-04-10 10:13:08
我有以下多元數(shù)組:x := [2][3]int{    {3, 2, 1},    {3, 2, 1},}行和列都是固定大小的。我正在嘗試檢查行是否已排序,并且我理解排序函數(shù)需要大小未知的數(shù)組。我怎樣才能要求 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條經(jīng)驗 獲得超2個贊

解決代碼問題

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

}


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

TA貢獻1842條經(jīng)驗 獲得超13個贊

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

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

var allTrue bool = true

for i := range x {

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

? ? ? ? allTrue = false

? ? ? ? break

? ? }

}


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

TA貢獻1827條經(jīng)驗 獲得超8個贊

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


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.


查看完整回答
反對 回復(fù) 2023-04-10
  • 3 回答
  • 0 關(guān)注
  • 182 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號