diff options
author | Tianon Gravi <admwiggin@gmail.com> | 2015-01-15 11:54:00 -0700 |
---|---|---|
committer | Tianon Gravi <admwiggin@gmail.com> | 2015-01-15 11:54:00 -0700 |
commit | f154da9e12608589e8d5f0508f908a0c3e88a1bb (patch) | |
tree | f8255d51e10c6f1e0ed69702200b966c9556a431 /src/pkg/sort/example_multi_test.go | |
parent | 8d8329ed5dfb9622c82a9fbec6fd99a580f9c9f6 (diff) | |
download | golang-upstream/1.4.tar.gz |
Imported Upstream version 1.4upstream/1.4
Diffstat (limited to 'src/pkg/sort/example_multi_test.go')
-rw-r--r-- | src/pkg/sort/example_multi_test.go | 131 |
1 files changed, 0 insertions, 131 deletions
diff --git a/src/pkg/sort/example_multi_test.go b/src/pkg/sort/example_multi_test.go deleted file mode 100644 index ac316540f..000000000 --- a/src/pkg/sort/example_multi_test.go +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright 2013 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" -) - -// A Change is a record of source code changes, recording user, language, and delta size. -type Change struct { - user string - language string - lines int -} - -type lessFunc func(p1, p2 *Change) bool - -// multiSorter implements the Sort interface, sorting the changes within. -type multiSorter struct { - changes []Change - less []lessFunc -} - -// Sort sorts the argument slice according to the less functions passed to OrderedBy. -func (ms *multiSorter) Sort(changes []Change) { - ms.changes = changes - sort.Sort(ms) -} - -// OrderedBy returns a Sorter that sorts using the less functions, in order. -// Call its Sort method to sort the data. -func OrderedBy(less ...lessFunc) *multiSorter { - return &multiSorter{ - less: less, - } -} - -// Len is part of sort.Interface. -func (ms *multiSorter) Len() int { - return len(ms.changes) -} - -// Swap is part of sort.Interface. -func (ms *multiSorter) Swap(i, j int) { - ms.changes[i], ms.changes[j] = ms.changes[j], ms.changes[i] -} - -// Less is part of sort.Interface. It is implemented by looping along the -// less functions until it finds a comparison that is either Less or -// !Less. Note that it can call the less functions twice per call. We -// could change the functions to return -1, 0, 1 and reduce the -// number of calls for greater efficiency: an exercise for the reader. -func (ms *multiSorter) Less(i, j int) bool { - p, q := &ms.changes[i], &ms.changes[j] - // Try all but the last comparison. - var k int - for k = 0; k < len(ms.less)-1; k++ { - less := ms.less[k] - switch { - case less(p, q): - // p < q, so we have a decision. - return true - case less(q, p): - // p > q, so we have a decision. - return false - } - // p == q; try the next comparison. - } - // All comparisons to here said "equal", so just return whatever - // the final comparison reports. - return ms.less[k](p, q) -} - -var changes = []Change{ - {"gri", "Go", 100}, - {"ken", "C", 150}, - {"glenda", "Go", 200}, - {"rsc", "Go", 200}, - {"r", "Go", 100}, - {"ken", "Go", 200}, - {"dmr", "C", 100}, - {"r", "C", 150}, - {"gri", "Smalltalk", 80}, -} - -// ExampleMultiKeys demonstrates a technique for sorting a struct type using different -// sets of multiple fields in the comparison. We chain together "Less" functions, each of -// which compares a single field. -func Example_sortMultiKeys() { - // Closures that order the Change structure. - user := func(c1, c2 *Change) bool { - return c1.user < c2.user - } - language := func(c1, c2 *Change) bool { - return c1.language < c2.language - } - increasingLines := func(c1, c2 *Change) bool { - return c1.lines < c2.lines - } - decreasingLines := func(c1, c2 *Change) bool { - return c1.lines > c2.lines // Note: > orders downwards. - } - - // Simple use: Sort by user. - OrderedBy(user).Sort(changes) - fmt.Println("By user:", changes) - - // More examples. - OrderedBy(user, increasingLines).Sort(changes) - fmt.Println("By user,<lines:", changes) - - OrderedBy(user, decreasingLines).Sort(changes) - fmt.Println("By user,>lines:", changes) - - OrderedBy(language, increasingLines).Sort(changes) - fmt.Println("By language,<lines:", changes) - - OrderedBy(language, increasingLines, user).Sort(changes) - fmt.Println("By language,<lines,user:", changes) - - // Output: - // By user: [{dmr C 100} {glenda Go 200} {gri Smalltalk 80} {gri Go 100} {ken Go 200} {ken C 150} {r Go 100} {r C 150} {rsc Go 200}] - // By user,<lines: [{dmr C 100} {glenda Go 200} {gri Smalltalk 80} {gri Go 100} {ken C 150} {ken Go 200} {r Go 100} {r C 150} {rsc Go 200}] - // By user,>lines: [{dmr C 100} {glenda Go 200} {gri Go 100} {gri Smalltalk 80} {ken Go 200} {ken C 150} {r C 150} {r Go 100} {rsc Go 200}] - // By language,<lines: [{dmr C 100} {ken C 150} {r C 150} {gri Go 100} {r Go 100} {ken Go 200} {glenda Go 200} {rsc Go 200} {gri Smalltalk 80}] - // By language,<lines,user: [{dmr C 100} {ken C 150} {r C 150} {gri Go 100} {r Go 100} {glenda Go 200} {ken Go 200} {rsc Go 200} {gri Smalltalk 80}] - -} |