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

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

如何使用 Golang 在結(jié)構(gòu)切片中找到最頻繁的整數(shù)

如何使用 Golang 在結(jié)構(gòu)切片中找到最頻繁的整數(shù)

Go
慕妹3242003 2023-02-21 13:21:33
這是問題的總結(jié):我試圖從來自解碼的 .json 文件(包含字符串“name”和整數(shù)“age”)的結(jié)構(gòu)中找到最常見的“age”。之后我需要根據(jù)“年齡”的最大出現(xiàn)頻率打印“姓名”。根據(jù)“年齡”的最大出現(xiàn)次數(shù)打印的“姓名”需要按字母順序排序輸入(.json):[{"name": "John","age": 15},{"name": "Peter","age": 12},{"name": "Roger","age": 12},{"name": "Anne","age": 44},{"name": "Marry","age": 15},{"name": "Nancy","age": 15}]輸出:['John', 'Mary', 'Nancy']。解釋:因?yàn)閿?shù)據(jù)中出現(xiàn)次數(shù)最多的年齡是 15 歲(出現(xiàn) 3 次),所以輸出應(yīng)該是一個(gè)包含三個(gè)人姓名的字符串?dāng)?shù)組,在這種情況下應(yīng)該是 ['John', 'Mary', 'Nancy' ].例外 :如果有多個(gè)“年齡”具有相同的最大出現(xiàn)次數(shù),我需要拆分?jǐn)?shù)據(jù)并將它們打印到不同的數(shù)組中(即當(dāng)“Anne”年齡為 12 歲時(shí),結(jié)果為:['John', 'Mary ', '南希'], ['安妮', '彼得', '羅杰']這是我嘗試過的(在 Golang 中):package main{import (    "encoding/json"    "fmt"    "os"    "sort")// 1. preparing the empty struct for .jsontype Passanger struct {    Name string `json:"name"`    Age  int    `json:"age"`}func main() {    // 2. load the json file    content, err := os.ReadFile("passanger.json")    if err != nil {        fmt.Println(err.Error())    }    // 3. parse json file to slice    var passangers []Passanger    err2 := json.Unmarshal(content, &passangers)    if err2 != nil {        fmt.Println("Error JSON Unmarshalling")        fmt.Println(err2.Error())    }    // 4. find most frequent age numbers (?)    for _, v := range passangers {        // this code only show the Age on every line        fmt.Println(v.Age)    }    // 5. print the name and sort them apabethically (?)       // use sort.slice package       // implement group based by "max-occurence-age"}從昨天開始就卡住了,我還嘗試從許多編碼挑戰(zhàn)問題中實(shí)施解決方案,例如:func majorityElement(arr int) int {    sort.Ints(arr)    return arr[len(arr)/2]}但我仍在努力理解如何將 Passanger 切片中的“年齡”值作為整數(shù)輸入 (arr int) 處理到上面的代碼中。我在網(wǎng)上找到的其他解決方案是通過迭代 map[int]int 來找到最大頻率:func main(){    arr := []int{90, 70, 30, 30, 10, 80, 40, 50, 40, 30}    freq := make(map[int]int)    for _ , num :=  range arr {        freq[num] = freq[num]+1    }    fmt.Println("Frequency of the Array is : ", freq)}但話又說回來,.json 文件不僅包含整數(shù)(年齡),還包含字符串(名稱)格式,我仍然不知道如何分別處理“名稱”和“年齡”..我真的需要一個(gè)適當(dāng)?shù)闹笇?dǎo)。*** 這是我上面提到的源代碼 (main.go) 和 (.json) 文件: https: //github.com/ariejanuarb/golang-json
查看完整描述

2 回答

?
白衣非少年

TA貢獻(xiàn)1155條經(jīng)驗(yàn) 獲得超0個(gè)贊

在實(shí)施解決方案之前要做什么

在我大學(xué)的第一年,我的老師總是對我和我的同學(xué)們重復(fù)一些事情,不要先寫代碼,特別是如果你是初學(xué)者,請按照以下步驟操作:

  • 寫下你想要發(fā)生的事

  • 將問題詳細(xì)化為小步驟

  • 寫出分支時(shí)的所有場景和案例

  • 寫入輸入和輸出(方法/函數(shù)簽名)

  • 檢查它們是否適合彼此

讓我們按照這些步驟...

寫下你想要發(fā)生的事

你已經(jīng)很好地定義了你的問題,所以我將跳過這一步。

讓我們進(jìn)一步詳細(xì)說明

  1. 你有一份乘客名單

  2. 你想按年齡對乘客進(jìn)行分組

  3. 你想看看哪些是最常見的/哪些乘客最多。

  4. 你想按字母順序打印名字

分支出

  • 場景一:一個(gè)組的規(guī)模比其他所有組都大。

  • 情況二:兩個(gè)或多個(gè)組具有相同的大小并且比其他組大。

可能會有更多的場景,但它們是你的

輸入輸出 ??

現(xiàn)在我們已經(jīng)知道我們必須做什么,我們將檢查每個(gè)步驟的輸入和輸出以實(shí)現(xiàn)這個(gè)目標(biāo)。

步驟:

  1. 你有一份乘客名單

  • 輸入 => 無或文件名(字符串)

  • 輸出=> []乘客

  1. 你想按年齡對乘客進(jìn)行分組

  • input => []Passenger // 乘客列表

  • output => map[int][]int 或 map[int][]&Passenger // ageGroups

第一種,括號內(nèi)的是全組年齡。

第二種類型是一個(gè)列表,其中包含:

  • 乘客在列表中的位置

  • 物體/乘客在內(nèi)存中的地址

這并不重要,只要我們可以輕松地從列表中取回乘客而無需再次迭代即可。

  1. 你想看看哪些是最常見的/哪些乘客最多。

  • 輸入 => 組(年齡組)

所以這里我們有場景 1 和場景 2 的分支......這意味著它必須對所有場景都有效或使用條件將它們分支出來。

  • 場景 1 的輸出 => 最常見的年齡 (int)

  • 場景 2 的輸出 => 最常見的年齡 ([]int)

我們可以看到場景 1 的輸出可以與場景 2 的輸出合并

  1. 您想要按年齡組中所有乘客的字母順序打印姓名

    老實(shí)說,如果你愿意,你可以跳過這個(gè)。

    • input => groups ([]Passenger) + ages ([]int) + passenger list ([]Passenger).

    • output => string or []byte or nothing if you just print it...

檢查后,是時(shí)候編碼了

讓我們首先創(chuàng)建適合我們簽名的功能

type Passenger struct {

    Name string `json:"name"`

    Age  int    `json:"age"`

}


func GetPassengerList() []Passenger{

   // 2. load the json file

   content, err := os.ReadFile("passanger.json")

   if err != nil {

       fmt.Println(err.Error())

   }


   // 3. parse json file to slice

   var passengers []Passenger

 

   err2 := json.Unmarshal(content, &passengers)

   if err2 != nil {

       fmt.Println("Error JSON Unmarshalling")

       fmt.Println(err2.Error())

   }


   return passengers

}


// 4a. Group by Age

func GroupByAge(passengers []Passenger) map[int][]int {

    group := make(map[int][]int, 0)


    for index, passenger := range passengers {

        ageGroup := group[passenger.Age]

        ageGroup = append(ageGroup, index)

        group[passenger.Age] = ageGroup

    }


    return group

}


// 4b. find the most frequent age numbers


func FindMostCommonAge(ageGroups map[int][]int) []int {

    mostFrequentAges := make([]int, 0)

    biggestGroupSize := 0


    // find most frequent age numbers

    for age, ageGroup := range ageGroups {

        // is most frequent age

        if biggestGroupSize < len(ageGroup) {

            biggestGroupSize = len(ageGroup)

            mostFrequentAges = []int{age}

        } else if biggestGroupSize == len(ageGroup) { // is one of the most frequent age

            mostFrequentAges = append(mostFrequentAges, age)

        }

        // is not one of the most frequent age so does nothing

    }


    return mostFrequentAges

}


func main() {

    passengers := loadPassengers()


    // I am lazy but if you want you could sort the

    // smaller slice before printing to increase performance

    sort.Slice(passengers, func(i, j int) bool {

        if passengers[i].Age == passengers[j].Age {

            return passengers[i].Name < passengers[j].Name

        }

        return passengers[i].Age < passengers[j].Age

    })


    // age => []position

    // Length of the array count as the number of occurences

    ageGrouper := GroupByAge(passengers)


    mostFrequentAges := FindMostCommonAge(ageGrouper)


    // print the passenger

    for _, age := range mostFrequentAges {

        fmt.Println("{")

        for _, passengerIndex := range ageGrouper[age] {

            fmt.Println("\t", passengers[passengerIndex].Name)

        }

        fmt.Println("}")

    }

}


查看完整回答
反對 回復(fù) 2023-02-21
?
冉冉說

TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超1個(gè)贊

應(yīng)該比任何更復(fù)雜

  • 按年齡和名稱對源切片進(jìn)行排序

  • 將其分解成具有共同年齡的序列,并且

  • 在進(jìn)行過程中,跟蹤最常見的

是這樣的:

https://goplay.tools/snippet/6pCpkTEaDXN

type Person struct {

    Age  int

    Name string

}


func MostCommonAge(persons []Person) (mostCommonAge int, names []string) {

  

  sorted := make([]Person, len(persons))

  copy(sorted, persons)

  

  // sort the slice by age and then by name

  sort.Slice(sorted, func(x, y int) bool {

    left, right := sorted[x], sorted[y]

    

    switch {

    case left.Age < right.Age:

      return true

    case left.Age > right.Age:

      return false

    default:

      return left.Name < right.Name

    }

  })


  updateMostCommonAge := func(seq []Person) (int, []string) {

    

    if len(seq) > len(names) {

      

      buf := make([]string, len(seq))

      for i := 0; i < len(seq); i++ {

        buf[i] = seq[i].Name

      }

      

      mostCommonAge = seq[0].Age

      names = buf

      

    }


    return mostCommonAge, names

  

  }


  for lo, hi := 0, 0; lo < len(sorted); lo = hi {

    

    for hi = lo; hi < len(sorted) && sorted[lo].Age == sorted[hi].Age; {

      hi++

    }

    

    mostCommonAge, names = updateMostCommonAge(sorted[lo:hi])

    

  }


  return mostCommonAge, names

}

另一種方法使用更多內(nèi)存,但更簡單一些。在這里,我們按年齡構(gòu)建了一個(gè)名字映射,然后對其進(jìn)行迭代以找到具有最長名字列表的鍵。


https://goplay.tools/snippet/_zmMys516IM


type Person struct {

    Age  int

    Name string

}


func MostCommonAge(persons []Person) (mostCommonAge int, names []string) {

    namesByAge := map[int][]string{}


    for _, p := range persons {

        value, found := namesByAge[p.Age]

        if !found {

            value = []string{}

        }

        namesByAge[p.Age] = append(value, p.Name)

    }


    for age, nameList := range namesByAge {

        if len(nameList) > len(names) {

            mostCommonAge, names = age, nameList

        }

    }


    return mostCommonAge, names

}


查看完整回答
反對 回復(fù) 2023-02-21
  • 2 回答
  • 0 關(guān)注
  • 114 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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