2017-09-22 1 views
1

Ich habe Scheibe wie untenWie Scheibe nach dem numerischen Wert sortieren und wenn numerischer Wert entspricht dann sortiert nach alphabetischer Reihenfolge

{string, int } 

[{zaa 1} {aab 1} {xac 1}] 

in diesem Fall int Seite gleich so nicht ich mit alphabetischer Reihenfolge sortieren muß

wenn meine Scheibe wie unten

[{zaa 1} {aab 4} {xac 2}] 

ich brauche numerischen Wert zu sortieren verwenden, wie kann ich dies tun?

Im Moment bin ich Art von Scheiben

type ByStringValue []string 
type ByNumericValue []WeightBaseResourceInfo 


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



func (a ByNumericValue) Len() int  { return len(a) } 
func (a ByNumericValue) Swap(i, j int) { a[i], a[j] = a[j], a[i] } 
func (a ByNumericValue) Less(i, j int) bool { 
    w1 := a[i].Weight 
    w2 := a[j].Weight 
    return w1 > w2 
} 

Antwort

0
type ByName []WeightBaseResourceInfo 

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



func main() { 

    resourceWeightInfo := make([]WeightBaseResourceInfo, 3) 
    start := make([]WeightBaseResourceInfo, 3) 
    var tempWeightInfo WeightBaseResourceInfo 
    tempWeightInfo.ResourceId = "zaa" 
    tempWeightInfo.Weight = 2 
    resourceWeightInfo[0] = tempWeightInfo 
    tempWeightInfo.ResourceId = "aab" 
    tempWeightInfo.Weight = 5 
    resourceWeightInfo[1] = tempWeightInfo 
    tempWeightInfo.ResourceId = "xac" 
    tempWeightInfo.Weight = 1 
    resourceWeightInfo[2] = tempWeightInfo 

    copy(start,resourceWeightInfo) 

    fmt.Println("start", start) 

    sort.Sort(ByNumericValue(resourceWeightInfo)) 

    if(reflect.DeepEqual(start,resourceWeightInfo)){ 
     sort.Sort(ByName(resourceWeightInfo)) 
    } 
    fmt.Println("Sorted", resourceWeightInfo) 

} 

Import "reflektieren"

1

Zum Sortieren, einfach sort.Slice() verwenden, hinzugefügt in Go 1.8 golang gegeben werden.

Um sort.Slice() zu verwenden, müssen Sie nur eine Vergleichsfunktion bereitstellen, die angeben muss, ob ein Element kleiner als ein anderes ist.

Die Logik in der less() Funktion sollte die Nummern zuerst testen, wenn sie sich unterscheiden, sollten die Zahlen das Ergebnis entscheiden. Wenn sie gleich sind, vergleichen Sie die Textwerte, um festzustellen, ob einer kleiner ist als der andere.

Zum Beispiel:

type Entry struct { 
    Text string 
    Number int 
} 

func main() { 
    es := []Entry{ 
     {"zaa", 1}, {"aab", 1}, {"xac", 1}, 
     {"zaa", 1}, {"aab", 4}, {"xac", 2}, 
    } 

    sort.Slice(es, func(i, j int) bool { 
     if a, b := es[i].Number, es[j].Number; a != b { 
      return a < b 
     } 
     return es[i].Text < es[j].Text 
    }) 

    fmt.Println(es) 
} 

Output (versuchen Sie es auf dem Go Playground):

[{aab 1} {xac 1} {zaa 1} {zaa 1} {xac 2} {aab 4}] 
Verwandte Themen