This is a sample script for sorting a slice using Golang. Recently, I had a situation for sorting the coordinates of cells of Spreadsheet. As a test case, it thinks of the situation that the randomized cells are sorted. I think that this can be also used for a table except for Spreadsheet.
Sample slice:
The sample slice is as follows.
ar := []struct {
row int
col int
value string
}{
{0, 0, "A1"},
{0, 1, "B1"},
{0, 2, "C1"},
{1, 0, "A2"},
{1, 1, "B2"},
{1, 3, "D2"},
{2, 0, "A3"},
{2, 2, "C3"},
}
When each element of above slice is put to a Spreadsheet, it becomes as follows.
At the following sample script, after above element is randomized, the original slice is retrieved.
Sample script 1:
package main
import (
"fmt"
"math/rand"
"sort"
)
func main() {
// Original slice
ar := []struct {
row int
col int
value string
}{
{0, 0, "A1"},
{0, 1, "B1"},
{0, 2, "C1"},
{1, 0, "A2"},
{1, 1, "B2"},
{1, 3, "D2"},
{2, 0, "A3"},
{2, 2, "C3"},
}
fmt.Println(ar)
// Randomize slice
// https://stackoverflow.com/a/12267471
for i := range ar {
j := rand.Intn(i + 1)
ar[i], ar[j] = ar[j], ar[i]
}
fmt.Println(ar)
// Sort
sort.Slice(ar, func(i, j int) bool {
if ar[i].row < ar[j].row {
return true
} else if (ar[i].col < ar[j].col) && (ar[i].row == ar[j].row) {
return true
}
return false
})
fmt.Println(ar)
}
Result:
[{0 0 A1} {0 1 B1} {0 2 C1} {1 0 A2} {1 1 B2} {1 3 D2} {2 0 A3} {2 2 C3}]
[{1 3 D2} {1 1 B2} {0 2 C1} {2 0 A3} {2 2 C3} {0 0 A1} {1 0 A2} {0 1 B1}]
[{0 0 A1} {0 1 B1} {0 2 C1} {1 0 A2} {1 1 B2} {1 3 D2} {2 0 A3} {2 2 C3}]
Sample script 2:
When row
and col
are switched as follows, the transposed result is obtained.
package main
import (
"fmt"
"math/rand"
"sort"
)
func main() {
// Original slice
ar := []struct {
row int
col int
value string
}{
{0, 0, "A1"},
{0, 1, "B1"},
{0, 2, "C1"},
{1, 0, "A2"},
{1, 1, "B2"},
{1, 3, "D2"},
{2, 0, "A3"},
{2, 2, "C3"},
}
fmt.Println(ar)
// Randomize slice
// https://stackoverflow.com/a/12267471
for i := range ar {
j := rand.Intn(i + 1)
ar[i], ar[j] = ar[j], ar[i]
}
fmt.Println(ar)
// Sort
sort.Slice(ar, func(i, j int) bool {
if ar[i].col < ar[j].col {
return true
} else if (ar[i].row < ar[j].row) && (ar[i].col == ar[j].col) {
return true
}
return false
})
fmt.Println(ar)
}
Result:
[{0 0 A1} {0 1 B1} {0 2 C1} {1 0 A2} {1 1 B2} {1 3 D2} {2 0 A3} {2 2 C3}]
[{1 3 D2} {1 1 B2} {0 2 C1} {2 0 A3} {2 2 C3} {0 0 A1} {1 0 A2} {0 1 B1}]
[{0 0 A1} {1 0 A2} {2 0 A3} {0 1 B1} {1 1 B2} {0 2 C1} {2 2 C3} {1 3 D2}]