]> Cypherpunks repositories - gostls13.git/commitdiff
sort: add interface examples
authorAndrew Gerrand <adg@golang.org>
Thu, 16 Feb 2012 02:16:07 +0000 (13:16 +1100)
committerAndrew Gerrand <adg@golang.org>
Thu, 16 Feb 2012 02:16:07 +0000 (13:16 +1100)
R=golang-dev, bradfitz, r
CC=golang-dev
https://golang.org/cl/5677060

src/pkg/sort/example_interface_test.go [new file with mode: 0644]
src/pkg/sort/example_reverse_test.go [new file with mode: 0644]

diff --git a/src/pkg/sort/example_interface_test.go b/src/pkg/sort/example_interface_test.go
new file mode 100644 (file)
index 0000000..4c88821
--- /dev/null
@@ -0,0 +1,77 @@
+// 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 ExampleInterface() {
+       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)
+       }
+}
diff --git a/src/pkg/sort/example_reverse_test.go b/src/pkg/sort/example_reverse_test.go
new file mode 100644 (file)
index 0000000..7c7f05b
--- /dev/null
@@ -0,0 +1,30 @@
+// 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"
+)
+
+// Reverse embeds a sort.Interface value and implements a reverse sort over
+// that value.
+type Reverse struct {
+       // This embedded Interface permits Reverse to use the methods of
+       // another Interface implementation.
+       sort.Interface
+}
+
+// Less returns the opposite of the embedded implementation's Less method.
+func (r Reverse) Less(i, j int) bool {
+       return r.Interface.Less(j, i)
+}
+
+func ExampleInterface_reverse() {
+       s := []int{5, 2, 6, 3, 1, 4} // unsorted
+       sort.Sort(Reverse{sort.IntSlice(s)})
+       fmt.Println(s)
+       // Output: [6 5 4 3 2 1]
+}