英文:
Sort descending struct in golang
问题
请查看这个示例。我想要的很简单:我想要按降序对所有的"records"进行排序。我无法弄清楚如何做到这一点。原因是我的结构体包含一个或多个记录,我不确定如何处理它们。(例如,这个示例可以正常工作)
英文:
Please see this playground. What I want is quiet simple: I want to sort all "records" descending. I cannot figure out how. Reason is that my struct contains one or more records and I'm not sure how to handle that. (f.e. this works fine)
答案1
得分: 7
从你的示例中,你试图对根元素<records>
进行排序,而不是子元素<record>
。
这个示例效果更好,使用了以下代码:
type ById []Record
sort.Sort(sort.Reverse(ById(records.Records)))
你的Len()
、Swap()
和Less()
方法保持不变,但是将Record
实例作为接收器使用,而不是Records
。
输出结果:
{{ records}
[{{ record} 64321 http://golang.com}
{{ record} 3456 http://www.lommers.org/sampleurl}
{{ record} 4 http://www.this-is-my-url.com}]}
正如我在“如何避免为类似的golang结构重新实现sort.Interface”中提到的,这在Go 1.8和提交ad26bb5中发生了变化:
你只需要定义一个Less()
匿名lambda函数:
a := ById(records.Records)
sort.Slice(a, func(i, j int) bool {
return a[i] > a[j]
})
英文:
From your example, you are trying to sort the root element <records>
instead of the sub-elements <record>
.
This example works better, with:
type ById []Record
sort.Sort(sort.Reverse(ById(records.Records)))
Your Len()
, Swap()
and Less()
methods remain unchanged, but use as a receiver a Record
instance instead of Records
.
Output:
{{ records}
[{{ record} 64321 http://golang.com}
{{ record} 3456 http://www.lommers.org/sampleurl}
{{ record} 4 http://www.this-is-my-url.com}]}
As I mention in "How to avoid re-implementing sort.Interface for similar golang structs", this changes with Go 1.8 and commit ad26bb5:
You only define a Less()
anonymous lambda
a := ById(records.Records)
sort.Slice(a, func(i, j int) bool {
return a[i] > a[j]
})
答案2
得分: 4
如果你有一个按升序排序的sort.Interface
实现,你可以使用sort.Reverse
函数生成一个按降序排序的版本。
所以如果data
实现了sort.Interface
,并且你有一个像这样的调用:
sort.Sort(data)
那么你可以通过将其改为以下方式来切换到降序排序:
sort.Sort(sort.Reverse(data))
在内部,sort.Reverse
返回的排序器只是直接通过sort.Interface
方法调用进行代理,除了Less
方法,在这个方法中它交换了两个参数的位置。
英文:
If you have a sort.Interface
implementation that sorts in ascending order, you can use the sort.Reverse
function to produce a version that will sort in reverse.
So if data
implements sort.Interface
and you have a call like:
sort.Sort(data)
Then you can switch to descending order by changing it to:
sort.Sort(sort.Reverse(data))
Internally, the sorter returned by sort.Reverse
just proxies the sort.Interface
method calls straight through with the exception of Less
where it switches the two arguments.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论