LoginSignup
2
2

More than 5 years have passed since last update.

Golang Sortの使い方 -snippetつき

Last updated at Posted at 2016-01-25

問題

ここから拝借
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>
2
2
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2