Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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
String 去整理一片符文?_String_Sorting_Go_Slice_Rune - Fatal编程技术网

String 去整理一片符文?

String 去整理一片符文?,string,sorting,go,slice,rune,String,Sorting,Go,Slice,Rune,我无法按字符对字符串进行排序(为了检查两个字符串是否为字谜,我想对它们进行排序,并检查是否相等) 我可以得到字符串s的[]符文表示,如下所示: runes := make([]rune, len(s)) copy(runes, []rune(s)) 我可以像这样对整数进行排序 someInts := []int{5, 2, 6, 3, 1, 4} // unsorted sort.Ints(someInts) 但是rune只是int32的别名,所以我应该可以调用 sort.Ints(run

我无法按字符对字符串进行排序(为了检查两个字符串是否为字谜,我想对它们进行排序,并检查是否相等)

我可以得到字符串
s
[]符文表示,如下所示:

runes := make([]rune, len(s)) 
copy(runes, []rune(s))
我可以像这样对整数进行排序

someInts := []int{5, 2, 6, 3, 1, 4} // unsorted
sort.Ints(someInts)
但是
rune
只是
int32
的别名,所以我应该可以调用

sort.Ints(runes) 
但是,我得到了一个错误:

cannot use runes (type []rune) as type []int in function argument
所以。。。如何对int32、int64或int*的切片进行排序

编辑:我确实整理了我的符文,但天哪,这太难看了

type RuneSlice []rune

func (p RuneSlice) Len() int           { return len(p) }
func (p RuneSlice) Less(i, j int) bool { return p[i] < p[j] }
func (p RuneSlice) Swap(i, j int)      { p[i], p[j] = p[j], p[i] }

func sorted(s string) string {
    runes := []rune(s)
    sort.Sort(RuneSlice(runes))
    return string(runes)
}
type RuneSlice[]符文
func(p RuneSlice)Len()int{return Len(p)}
func(p RuneSlice)Less(i,j int)bool{返回p[i]
因此,基本上,如果你有一个切片,你就必须将它包装成一个实现
sort.Interface
的类型。所有这些实现都将具有完全相同的方法体(如
sort.IntSlice
sort.Float64Slice
)。如果这真的很难看,那么为什么他们不在
排序
包中提供这些WhateverSlice包装?仿制药的缺乏现在开始造成严重的伤害。一定有更好的分类方法

使用和实现,请参见软件包文档中的示例

不能将
rune
int32
用作
int
。检查
int
的值

int是大小至少为32位的有符号整数类型。这是一个 但是,不同的类型,而不是int32的别名


作为一个比较点,这里是如果排序接口略有不同的情况下的情况。也就是说,与其说接口在容器上,不如说接口在元素上会是什么样子

拆开包装以取回我们的符文:

    sortedRunes := make([]rune, len(msg))
    for i, v := range comparables {
        sortedRunes[i] = rune(v.(ComparableRune))
    }
这种方法似乎要求我们知道如何进行类型转换,以便在接口和值的动态类型之间来回转换。与使用容器作为接口的方法相比,我们似乎需要使用更多的Go部分——更多的机制。

事实上,有一种软通用的方法可以实现您想要的功能

请查看以下软件包:

特别是以下文件:

如何使用它的示例:

tosort := []int{10, 3, 5, 1, 15, 6}

fun.Sort(func(a, b int) bool {
    return b < a
}, tosort)
tosort:=[]int{10,3,5,1,15,6}
fun.Sort(func(a,b int)bool{
返回b
还有许多其他有趣的通用算法是通过该包中的反射实现的


所有学分都转到。

注意:go 1.8将引入排序切片的帮助程序
路过

var strings=[…]字符串{”、“你好”、“foo”、“bar”、“foo”、“f00”、“%*&^*&^&”、“***”}
func TestSlice(t*testing.t){
数据:=字符串
切片(数据[:],函数(i,j int)布尔{
返回数据[i]
至少从2020年11月起,提供使用作为闭包传递的自定义Less函数。以下代码具有预期效果:

package main

import (
    "fmt"
    "sort"
)

func main() {

    s1 := "eidbaooo"

    runeSlice := []rune(s1)

    fmt.Println(string(runeSlice))

    sort.Slice(runeSlice, func(i, j int) bool {
        return runeSlice[i] < runeSlice[j]
    })
    
    fmt.Println(string(runeSlice))
}

这可以节省整个接口实现。

我选中了sort.go,这就是我最后要做的,但是加油!我真的必须实现RuneSlice、ByteSlice、Int32Slice、UintSlice等吗?这三种方法都是相同的,方法体也完全相同!如果这真的是除int和float64片之外对片进行排序的唯一方法,那么为什么他们不在sort.go中实现这些WhateverSlice类型呢?无论如何,我都会在我的UTIL中实现它们。这是因为缺少泛型吗?“来吧,一定有更好的办法。”安德拉斯:这是个好问题。我会把它放在StackOverflow上。@jnml谢谢,至少是这样。可能想发布一个答案,这样我就可以接受了。顺便说一句,我在谷歌上搜索了“golang sort util”,但没有找到这个包。您如何查找golang软件包?andras:似乎是找到高质量第三方软件包的好地方。@dyoo谢谢,尽管我真的希望手工编写高质量的Go库列表将很快变得不可行,因为Go越来越流行:)是的,这是对DRY的可怕违反。我的意思是,将完全相同的代码复制到与基本类型相同的次数是非常糟糕的。在基本类型上工作而无需任何额外拼接的通用排序算法与您在任何语言中所期望的非常接近。但是,必须教会编译器如何将一个切片的长度计算20倍是不现实的。你完全没有抓住要点。通用排序算法不仅适用于切片,而且适用于满足
sort.Interface
要求的任何内容。现在,您打算如何自动获取
Len
和任何您事先(在编译时)一无所知的内容的朋友???瞧,你的咆哮是不合理的。我不希望编译器能够对
BucketOfFish
实例进行开箱排序
sort.Interface
对于这些情况来说似乎是一个很好的抽象(尽管我可能也想把我的鱼切成片,而不是一些定制的容器)。我只是觉得奇怪,这样一个基本用例(基本类型的片段)没有包含在标准库中。您的
make
语句应该使用
utf8.runecounting
(来自
unicode/utf8
)而不是
len
len
计算字节数,而不是符文数。实际上,类型转换也可以!len([]符文(someString))产生的结果与utf8.RuneCountString相同(较少导入),但对于字谜解算器,它在99%的情况下并不重要。如果所有utf8字符的字节都相同,则不太可能发生冲突(尽管可能)。谢谢!这是很有帮助的(尽管实际上仍然不可用:)。至少我知道你会用Java风格来做。尽管如此,缺乏仿制药(一篮子苹果不是一篮子苹果)
tosort := []int{10, 3, 5, 1, 15, 6}

fun.Sort(func(a, b int) bool {
    return b < a
}, tosort)
var strings = [...]string{"", "Hello", "foo", "bar", "foo", "f00", "%*&^*&^&", "***"}

func TestSlice(t *testing.T) {
    data := strings
    Slice(data[:], func(i, j int) bool {
        return data[i] < data[j]
    })
}
package main

import (
    "fmt"
    "sort"
)

func main() {

    s1 := "eidbaooo"

    runeSlice := []rune(s1)

    fmt.Println(string(runeSlice))

    sort.Slice(runeSlice, func(i, j int) bool {
        return runeSlice[i] < runeSlice[j]
    })
    
    fmt.Println(string(runeSlice))
}
eidbaooo
abdeiooo