Home About
Golang

Golang, アイテムを日付でソートしたい

Golang でのソート処理をメモ。

Groovy(Java) の場合は、こんなコードになります。 Itemクラスを Comparable にする、という方法もありますが、 ここでは Comparator を使ってソートする方式で書きます。

class Item {
    String title
    String ymd
    String toString(){
        return "$title, $ymd"
    }
}

class ByYmd implements Comparator<Item> {
    int compare(Item item0, Item item1){
        return item1.ymd.compareTo(item0.ymd)
    }
}

def itemList = [
    new Item([title: "About Thinkpad 2018", ymd: "2018-01-01"]),
    new Item([title: "Thinkpad x1 nano", ymd: "2021-07-10"]),
    new Item([title: "Thinkpad E460", ymd: "2019-03-29"])]

Collections.sort(itemList, new ByYmd())

itemList.each {
    println "- $it"
}

実行すると:

- Thinkpad x1 nano, 2021-07-10
- Thinkpad E460, 2019-03-29
- About Thinkpad 2018, 2018-01-01

これを Golang で書くと:

package main

import (
	"fmt"
	"sort"
)

type Item struct {
	Title string
	Ymd   string
}

type ByYmd []Item

func (a ByYmd) Len() int           { return len(a) }
func (a ByYmd) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }
func (a ByYmd) Less(i, j int) bool { return a[i].Ymd < a[j].Ymd }


func main() {
	items := []Item{
		{"About Thinkpad 2018", "2018-01-01"},
		{"Thinkpad x1 nano", "2021-07-10"},
		{"Thinkpad E460", "2019-03-29"},
	}

	sort.Sort(ByYmd(items))

	for _, item := range items {
		fmt.Println(fmt.Sprintf("- %s, %s", item.Title, item.Ymd))
	}
}

sort by date (実際には sort.Sort(ByYmd(items)) ) のように書けるのがうれしいですね。