user5593444
user5593444

Reputation: 19

golang sort slices of slice by first element

i'm trying to do sorting for my slice child's (inside a slice), my slice is created from

var s [][]int64
s = append(s, []int64{2, 60, 55, 5})
s = append(s, []int64{4, 45, 35, 10})
s = append(s, []int64{1, 200, 160, 40})
fmt.Println(s) # [[2 60 55 5] [4 45 35 10] [1 200 160 40]]

how to sort it's value by first element to become :

[[1 200 160 40] [2 60 55 5] [4 45 35 10]]

Upvotes: 0

Views: 5175

Answers (3)

BtsRifer
BtsRifer

Reputation: 1

If applicable to your project, you can also utilise the deepsort package - note: I am the author of the package.

package main

import (
    "fmt"

    "github.com/gbatagian/deepsort"
)

func main() {
    var s [][]int64
    s = append(s, []int64{2, 60, 55, 5})
    s = append(s, []int64{4, 45, 35, 10})
    s = append(s, []int64{1, 200, 160, 40})

    deepsort.DeepSort(&s, []int{0})
    fmt.Println(s)
}

which would output:

[[1 200 160 40] [2 60 55 5] [4 45 35 10]]

Upvotes: 0

Mukesh Pilaniya
Mukesh Pilaniya

Reputation: 1

func slicesort(arr [][]int){
   
    sort.Slice(arr, func(i, j int) bool{
        if arr[i][1]>arr[j][1]{
            return true
        }
        if arr[i][1]==arr[j][1] && arr[i][0]<arr[j][0]{
            return true
        }
        return false
    })
}

func main() {
    s :=[][]int{{2,8},{2,9},{3,8},{1,9},{3,9}}
    slicesort(s)
    fmt.Println(s)
}

Upvotes: 0

colm.anseo
colm.anseo

Reputation: 22147

The question does not state what should be done with empty slices, so treating them like an empty word in a conventional word-sort, would put them first, so this would handle that edge case:

import "sort"

sort.Slice(s, func(i, j int) bool {
    // edge cases
    if len(s[i]) == 0 && len(s[j]) == 0 {
        return false // two empty slices - so one is not less than other i.e. false
    }
    if len(s[i]) == 0 || len(s[j]) == 0 {
        return len(s[i]) == 0 // empty slice listed "first" (change to != 0 to put them last)
    }

    // both slices len() > 0, so can test this now:
    return s[i][0] < s[j][0]
})

Playground version.

Upvotes: 4

Related Questions