同じ値を持つ別の文字列文字の順序で構造体のコレクションを並べ替えようとしています。
次に例を示します。
package main
import (
"fmt"
"sort"
"strings"
)
type Container struct {
Initial string
}
func main() {
s := "dfah"
c := []Container{}
for _, r := range "fadh" {
c = append(c, Container{Initial: string(r)})
}
sort.Slice(c, func(i, j int) bool {
str := strings.Compare(c[i].Initial, s)
if str == -1 {
return true
} else {
return false
}
})
fmt.Printf("Result: %s\n", c) // returns 'dafh'
fmt.Printf("Desired result: %s\n", s) // returns 'dfah'
}
望ましい結果は、並べ替えられたContainer
構造体のコレクションであり、「dfah」文字列と同じ順序になります。
https://play.golang.org/p/eDW5-xpCzv
それらは常に同じ文字/文字数を持ち、ソートされていません。これを達成するための正しい方法が何かはわかりません。何か案は?ありがとう!
スライスソーティング関数では、と比較c[i].Initial
していs
ます。それは単に間違っています。その代わりに、がbeforeとafterのどちらにc[i].Initial
出現するかを調べます。s
c[j].Initial
ここにいくつかのサンプルコードがあります、またはそれが遊び場で走っているのを見てください:
package main
import (
"fmt"
"sort"
"strings"
)
type Container struct {
Initial string
}
func main() {
s := "dfah"
c := []Container{}
for _, r := range "fadh" {
c = append(c, Container{Initial: string(r)})
}
sort.Slice(c, func(i, j int) bool {
return strings.Index(s, c[i].Initial) <= strings.Index(s, c[j].Initial)
})
fmt.Printf("Result: %s\n", c) // returns [{d} {f} {a} {h}]
fmt.Printf("Desired result: %s\n", s) // returns 'dfah'
}
これはs
何度もスキャンする必要があるため、実際には効率が悪いことに注意してください。これが実際のコードである場合、の文字からs
インデックスへのマップを作成して、strings.Index
呼び出しをマップルックアップで置き換えることができるようにします。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加