创建列表地图?

时间:2014-07-06 10:31:37

标签: go

我有一个结构,它有一个任务ID,一个日期和一个与此类似的注释字段:

type Journal struct {
    task_id int
    date  int
    comment string
}

对于每个task_id,我要为该task_id创建所有日记帐的列表。然后,我想将每个日记列表放入地图中,以便我可以轻松管理每个任务ID。以下是一些示例数据:

100, 20140701, "Failed to complete"
100, 20140702, "Removed data and finished in 5 minutes"

120, 20140701, "No issues"

130, 20140701, "Called analyst"
130, 20140702, "reloaded data"
130, 20140703, "Emailed results"

目前我不确定是否需要在知道评论日期之前订购评论。

如何创建列表地图?我还没有看到任何我做过的例子。一个清单。

x := make(map[int]Journal)

2 个答案:

答案 0 :(得分:3)

您可以使用以下代码创建所需的map

var m = make(map[int][]Journal)
for _, journal := range all_my_journals {
    m[journal.task_id] = append(m[journal.task_id], journal)
}

假设all_my_journals是您拥有的所有Journal变量的切片(或数组)。

然后,您可以获得给定ID的所有Journal的切片(而不是列表):

journals := m[my_task_id]

答案 1 :(得分:2)

添加到Julienc的优秀答案,如果您的目的是能够对期刊进行排序,您可以使用实现sort.Interface this的结构:

type JournalSorter struct {
    s   []*Journal
    f   func(a, b *Journal) bool
    rev bool
}

func NewSorter(j []*Journal) (js *JournalSorter) {
    js = &JournalSorter{s: make([]*Journal, len(j))}
    for i := range j {
        js.s[i] = j[i]
    }
    return
}
func (js *JournalSorter) ById(reverse bool) []*Journal {
    js.rev = reverse
    js.f = js.byId
    sort.Sort(js)
    return js.s
}

func (js *JournalSorter) ByDate(reverse bool) []*Journal {
    js.rev = reverse
    js.f = js.byDate
    sort.Sort(js)
    return js.s
}

func (js *JournalSorter) byId(a, b *Journal) bool {
    if js.rev {
        return a.Id > b.Id
    }
    return a.Id < b.Id
}

func (js *JournalSorter) byDate(a, b *Journal) bool {
    if js.rev {
        return a.Date > b.Date
    }
    return a.Date < b.Date
}

func (js *JournalSorter) Len() int {
    return len(js.s)
}

func (js *JournalSorter) Swap(i, j int) {
    if js.s != nil && js.f != nil {
        js.s[i], js.s[j] = js.s[j], js.s[i]
    }
}

func (js *JournalSorter) Less(i, j int) bool {
    if js.f != nil {
        return js.f(js.s[i], js.s[j])
    }
    return false
}
///.................

func main() {
    journals := m[my_task_id] //m = map[int][]*Journal
    s1 := NewSorter(journals)
    sorted_by_reverse_date := s1.ByDate(true)
}