問題
ここから拝借
2次元配列が渡されるので二次元配列内の配列から一番大きい数字を配列にまとめて返せ
テストコード
package largestNumber
import (
"testing"
"github.com/stretchr/testify/assert"
)
func Test(t *testing.T) {
a1 := [][]int{
[]int{13, 27, 18, 26},
[]int{4, 5, 1, 3},
[]int{32, 35, 37, 39},
[]int{1000, 1001, 857, 1},
}
a2 := [][]int{
[]int{4, 9, 1, 3},
[]int{13, 35, 18, 26},
[]int{32, 35, 97, 39},
[]int{1000000, 1001, 857, 1},
}
assert.Equal(t, largestOfFour(a1), []int{27, 5, 39, 1001}, "1")
assert.Equal(t, largestOfFour(a2), []int{9, 35, 97, 1000000}, "2")
}
解法
なんてことはありません。Sort関数を使うだけです。
LenとSwapがそれぞれ何をしてるか、なんで必要なのかイマイチわかりませんでした。(詳しい方、教えてくださると幸いです)
Len
-> 長さを返す。たいていの例ではそのまま長さを返してるだけでした。
Swap
-> どうも並び順を決めてるようです。iとjを入れ替えると結果が変わります。
Less
-> 並べ方を記述します。ここの記述方法は他の言語でも良く見ます。
package largestNumber
import (
"fmt"
"sort"
)
func largestOfFour(ar [][]int) []int {
resAr := []int{}
for i := 0; i <= len(ar)-1; i++ {
sort.Sort(retLargest(ar[i]))
resAr = append(resAr, ar[i][0])
}
return resAr
}
type retLargest []int
func (el retLargest) Len() int {
return len(el)
}
func (el retLargest) Swap(i, j int) {
el[i], el[j] = el[j], el[i]
}
func (el retLargest) Less(i, j int) bool {
return el[i] > el[j]
}
しかしGOのソート関数はRubyとかJSにくらべて入力項目が多くてめんどいですね。スニペット作りましょう。
snippet(Sublime用)
<snippet>
<content><![CDATA[
sort.Sort(${1:sortFuncName}(${9:element}))
type ${1:sortFuncName} ${2:[]int}
func (el ${1:sortFuncName}) Len() ${3:int} {
${4:return len(el)}
}
func (el ${1:sortFuncName}) Swap(i, j ${5:int}) {
${5:el[i], el[j] = el[j], el[i]}
}
func (el ${1:sortFuncName}) Less(i, j ${6:int}) ${7:bool} {
${8:return el[i] > el[j]}
}
]]></content>
<!-- Optional: Set a tabTrigger to define how to trigger the snippet -->
<tabTrigger>sort</tabTrigger>
<description>sort by func</description>
<!-- Optional: Set a scope to limit where the snippet will trigger -->
<scope>source.go</scope>
</snippet>