Commit 467122ce authored by Andriy Lytvynov's avatar Andriy Lytvynov Committed by Rob Pike

sort: add a simpler sort.Interface example

Existing example renamed to Example_sortWrapper.
Fixes #6335.

R=golang-dev, rsc, taj.khattra, r
CC=golang-dev
https://golang.org/cl/13586043
parent 78338d8c
...@@ -9,69 +9,35 @@ import ( ...@@ -9,69 +9,35 @@ import (
"sort" "sort"
) )
type Grams int type Person struct {
Name string
func (g Grams) String() string { return fmt.Sprintf("%dg", int(g)) } Age int
type Organ struct {
Name string
Weight Grams
} }
type Organs []*Organ func (p Person) String() string {
return fmt.Sprintf("%s: %d", p.Name, p.Age)
func (s Organs) Len() int { return len(s) } }
func (s Organs) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
// ByName implements sort.Interface by providing Less and using the Len and
// Swap methods of the embedded Organs value.
type ByName struct{ Organs }
func (s ByName) Less(i, j int) bool { return s.Organs[i].Name < s.Organs[j].Name }
// ByWeight implements sort.Interface by providing Less and using the Len and // ByAge implements sort.Interface for []Person based on
// Swap methods of the embedded Organs value. // the Age field.
type ByWeight struct{ Organs } type ByAge []*Person
func (s ByWeight) Less(i, j int) bool { return s.Organs[i].Weight < s.Organs[j].Weight } func (a ByAge) Len() int { return len(a) }
func (a ByAge) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
func (a ByAge) Less(i, j int) bool { return a[i].Age < a[j].Age }
func ExampleInterface() { func ExampleInterface() {
s := []*Organ{ people := []*Person{
{"brain", 1340}, &Person{Name: "Bob", Age: 31},
{"heart", 290}, &Person{Name: "John", Age: 42},
{"liver", 1494}, &Person{Name: "Michael", Age: 17},
{"pancreas", 131}, &Person{Name: "Jenny", Age: 26},
{"prostate", 62},
{"spleen", 162},
} }
sort.Sort(ByWeight{s}) fmt.Println(people)
fmt.Println("Organs by weight:") sort.Sort(ByAge(people))
printOrgans(s) fmt.Println(people)
sort.Sort(ByName{s})
fmt.Println("Organs by name:")
printOrgans(s)
// Output: // Output: [Bob: 31 John: 42 Michael: 17 Jenny: 26]
// Organs by weight: // [Michael: 17 Jenny: 26 Bob: 31 John: 42]
// prostate (62g)
// pancreas (131g)
// spleen (162g)
// heart (290g)
// brain (1340g)
// liver (1494g)
// Organs by name:
// brain (1340g)
// heart (290g)
// liver (1494g)
// pancreas (131g)
// prostate (62g)
// spleen (162g)
}
func printOrgans(s []*Organ) {
for _, o := range s {
fmt.Printf("%-8s (%v)\n", o.Name, o.Weight)
}
} }
// Copyright 2011 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package sort_test
import (
"fmt"
"sort"
)
type Grams int
func (g Grams) String() string { return fmt.Sprintf("%dg", int(g)) }
type Organ struct {
Name string
Weight Grams
}
type Organs []*Organ
func (s Organs) Len() int { return len(s) }
func (s Organs) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
// ByName implements sort.Interface by providing Less and using the Len and
// Swap methods of the embedded Organs value.
type ByName struct{ Organs }
func (s ByName) Less(i, j int) bool { return s.Organs[i].Name < s.Organs[j].Name }
// ByWeight implements sort.Interface by providing Less and using the Len and
// Swap methods of the embedded Organs value.
type ByWeight struct{ Organs }
func (s ByWeight) Less(i, j int) bool { return s.Organs[i].Weight < s.Organs[j].Weight }
func Example_sortWrapper() {
s := []*Organ{
{"brain", 1340},
{"heart", 290},
{"liver", 1494},
{"pancreas", 131},
{"prostate", 62},
{"spleen", 162},
}
sort.Sort(ByWeight{s})
fmt.Println("Organs by weight:")
printOrgans(s)
sort.Sort(ByName{s})
fmt.Println("Organs by name:")
printOrgans(s)
// Output:
// Organs by weight:
// prostate (62g)
// pancreas (131g)
// spleen (162g)
// heart (290g)
// brain (1340g)
// liver (1494g)
// Organs by name:
// brain (1340g)
// heart (290g)
// liver (1494g)
// pancreas (131g)
// prostate (62g)
// spleen (162g)
}
func printOrgans(s []*Organ) {
for _, o := range s {
fmt.Printf("%-8s (%v)\n", o.Name, o.Weight)
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment