2016-01-23 3 views
-2

Я бы likde сортировать эту карту, стоимостьСортировка отображение [строка] [] структура {}

type Graph struct { 
    vertice string 
    cost float64 
} 

var graph map[string][]Graph 

В порядке низшего к высшему

Спасибо!

+1

Непонятно, что означало бы «сортировка карты». Что вы пытаетесь сделать потом? Карты не имеют порядка, поэтому они не сортируются в традиционном смысле. –

+0

[sort package] (https://golang.org/pkg/sort/) имеет несколько примеров. У вас есть вопрос об использовании Sort? – JimB

ответ

1

Если цель состоит в сортировке каждого фрагмента в graph по стоимости, вам нужно всего лишь реализовать sort.Interface на []Graph, а затем использовать цикл for для циклического прохождения значений.

type ByCost []Graph 

func (gs *ByCost) Len() int { return len(gs) } 
func (gs *ByCost) Less(i, j int) bool { return gs[i].cost < gs[j].cost } 
func (gs *ByCost) Swap(i, j int) { gs[i], gs[j] = gs[j], gs[i] } 

for _, v := range graph { 
    sort.Sort(ByCost(v)) 

Если вы пытаетесь перебирать карты в порядке сортировки по сумме расходов в []Graph, что будет гораздо меньше чистой.

type GraphKeyPairs struct { 
    key string 
    value []Graph 
} 

// Build a slice to store our map values 
sortedGraph := make([]GraphKeyPairs, 0, len(graph)) 
for k,v := range graph { 
    // O(n) 
    gkp := GraphKeyPairs{key: k, value: v} 
    sortedGraph = append(sortedGraph, gkp) 
} 

type BySummedCost []GraphKeyPairs 

func (gkp *BySummedCost) Len() int { return len(gkp) } 
func (gkp *BySummedCost) Swap(i, j int) { gkp[i], gkp[j] = gkp[j], gkp[i] } 

func (gkp *BySummedCost) Less(i, j int) bool { 
    // O(2n) 
    iCost, jCost := 0, 0 
    for _, v := range gkp[i].value { 
     iCost += v.cost 
    } 
    for _, v := range gkp[j].value { 
     jCost += v.cost 
    } 
    return iCost < jCost 
} 

sort.Sort(BySummedCost(sortedGraph)) 
Смежные вопросы