Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 如何在Go中稳定反向排序切片?_Sorting_Go_Reverse_Stability - Fatal编程技术网

Sorting 如何在Go中稳定反向排序切片?

Sorting 如何在Go中稳定反向排序切片?,sorting,go,reverse,stability,Sorting,Go,Reverse,Stability,我确实有 4, 5', 6, 5'' 并希望将稳定排序反转为 6, 5', 5'', 4 但不是 6, 5'', 5', 4 此(无效)代码不起作用 keys := []int{4, 5', 6, 5''} sort.Stable(sort.Reverse(sort.Ints(keys))) 它将产生: 6, 5'', 5', 4 这里的问题被简化为一个整数切片,但实际上我需要将其应用于一个结构切片 type myStruct struct { t time.Time

我确实有

4, 5', 6, 5''
并希望将稳定排序反转为

6, 5', 5'', 4
但不是

6, 5'', 5', 4
此(无效)代码不起作用

keys := []int{4, 5', 6, 5''}
sort.Stable(sort.Reverse(sort.Ints(keys)))
它将产生:

6, 5'', 5', 4

这里的问题被简化为一个整数切片,但实际上我需要将其应用于一个结构切片

type myStruct struct {
    t time.Time
    d time.Duration
}
和基于
t
字段的反向稳定排序



编辑:在几句评论之后,我明确指出整数1是一个不起作用的示例,以简化问题。

在切片类型上实现
sort.Interface
接口,以便您可以选择排序顺序,并对其应用稳定排序。示例:

在自定义结构上实现
排序.Interface
接口

type myStruct struct{
    t time.Time
    d time.Duration
}

type Slice []myStruct

func (s Slice) Len() int {  return len(s) }

func (s Slice) Less(i, j int) bool {
    return (s[i].t).After(s[j].t)
}

func (s Slice) Swap(i, j int) {
    s[i], s[j] = s[j], s[i]
}
在您的情况下,以下函数将根据
t

func (s Slice) Less(i, j int) bool {
    return (s[i].t).After(s[j].t)
}
(s[i].t).After(s[j].t)
报告
s[i].t
是否在
s[j].t
之后

如果只需要排序,请使用下面的一个

func (s Slice) Less(i, j int) bool {
    return (s[i].t).Before(s[j].t)
}

希望这会有所帮助

似乎您不需要经历实现排序接口的麻烦。您可以使用或对裸体进行排序

以下是对我有效的方法():


您的代码不起作用:@Aminadav当然,这是一个使用整数来表示一般问题的简化示例。我注意到了这一点,但是我所寻找的行为与“反向和稳定排序”不同。我希望相等元素的顺序能像原始列表一样应用,而不是像反向列表一样应用。好吧,除非我误解了你的示例,否则我提供的代码可以工作,并且会生成你的第一个示例。哈!我知道你做了什么。您将Less()实现为'>'。这很聪明。@LorenzoBelli:Elwinar不想在稳定排序后反转:他建议用
Less
检查更多来稳定排序。他的答案是正确的。您仍然可以使用
排序。反转
,并使用
更少的正常定义。你试过了吗?看,是的,这肯定有帮助。它实际上是与Elwinar相同的解决方案,如图所示。这应该是你的工作是的。。。和埃尔温纳一样。我刚刚为您的场景添加了实现。
package main

import (
    "fmt"
    "sort"
    "time"
)

func main() {
    layout := "Jan 2 15:04:05 -0700 MST 2006"
    t1, _ := time.Parse(layout, "Jan 2 15:04:05 -0700 MST 2008")
    t2, _ := time.Parse(layout, "Jan 2 15:04:05 -0700 MST 2001")
    t3, _ := time.Parse(layout, "Jan 2 15:04:05 -0700 MST 2003")
    t4, _ := time.Parse(layout, "Jan 2 15:04:05 -0700 MST 2006")

    timestamps := []struct {
        T time.Time
        d time.Duration
    }{
        {t1, 1},
        {t2, 1},
        {t3, 1},
        {t4, 1},
    }

    // forward
    sort.Slice(timestamps, func(i, j int) bool { 
        return timestamps[i].T.Before(timestamps[j].T) 
    })
    fmt.Println("By time:", timestamps)

    // reverse
    sort.Slice(timestamps, func(i, j int) bool { 
        return timestamps[i].T.After(timestamps[j].T) 
    })
    fmt.Println("By time:", timestamps)
}