構造体の GoLang ソート スライス
このチュートリアルでは、GoLang で構造体のスライスを並べ替える方法を示します。
構造体の GoLang ソート スライス
GoLang には、構造体のスライスをソートするための 2つのメソッドが用意されています。 1つは sort.Slice
で、もう 1つは sort.SliceStable
です。 また、構造体のスライスをソートするには、これら 2つのメソッドとともに less
関数を使用する必要があります。
これらのメソッドの構文は次のとおりです。
//sort.Slice
func Slice(x StructSlice, less func(i, j int) bool)
//sort.SliceStable
func Slice(x StructSlice, less func(i, j int) bool)
x
が構造体のスライスである場合、スライスは less
関数に基づいてソートされます。 GoLang で構造体のスライスをソートする方法を理解するために、いくつかの例を実装してみましょう。
構造体のスライスをフィールドで並べ替える
フィールドによる構造体のスライスのソートは、構造体のスライスのソートの基本的な例です。 フィールドに基づいて構造体スライスのメンバーの値を同じ構造体スライスの他のメンバーと比較する例を見てみましょう。
package main
import (
"fmt"
"sort"
)
type Employee struct {
Name string
Salary int
}
func main() {
// Sort in Ascending order
employees := []Employee{
{Name: "John", Salary: 1500},
{Name: "Joe", Salary: 3000},
{Name: "Jack", Salary: 3400},
}
sort.Slice(employees, func(i, j int) bool {
return employees[i].Salary < employees[j].Salary
})
fmt.Println(employees)
// Sort in Descending order
employees1 := []Employee{
{Name: "John", Salary: 1500},
{Name: "Joe", Salary: 3000},
{Name: "Jack", Salary: 3400},
}
sort.Slice(employees1, func(i, j int) bool {
return employees1[i].Salary > employees1[j].Salary
})
fmt.Println(employees1)
}
上記のコードには、Name
と Salary
の 2つのフィールドを持つ構造体 Employee
が含まれており、構造体のスライスを作成し、Slice
メソッドを使用してフィールド Salary
に基づいて昇順に並べ替え、次に 別のスライスを降順に並べ替えます。
出力を参照してください。
[{John 1500} {Joe 3000} {Jack 3400}]
[{Jack 3400} {Joe 3000} {John 1500}]
現在、これらのタイプのスライスでは sort.SliceStable
を使用できません。これには、フィールド名と値のキーと値のペア (マップ) が含まれます。 sort.SliceStable
を使用すると、値のみを含む構造体の単純なスライスをソートできます。
package main
import (
"fmt"
"sort"
)
type Employee struct {
Name string
Salary int
}
func main() {
// Sort in Ascending order
employees := []Employee{
{"John", 1500},
{"Joe", 3000},
{"Jack", 3400},
}
sort.SliceStable(employees, func(i, j int) bool {
return employees[i].Salary < employees[j].Salary
})
fmt.Println(employees)
// Sort in Descending order
employees1 := []Employee{
{"John", 1500},
{"Joe", 3000},
{"Jack", 3400},
}
sort.SliceStable(employees1, func(i, j int) bool {
return employees1[i].Salary > employees1[j].Salary
})
fmt.Println(employees1)
}
上記のコードは、構造体のスライスに名前と値のキーと値のペアがないフィールドに基づいて、構造体のスライスを同様に並べ替えます。
出力を参照してください。
[{John 1500} {Joe 3000} {Jack 3400}]
[{Jack 3400} {Joe 3000} {John 1500}]
複数のフィールドによる構造体のスライスの並べ替え
複数のフィールドで構造体のスライスをソートすることも可能です。 less
関数を拡張する必要があります。 例を試してみましょう。
package main
import (
"fmt"
"sort"
)
type Employee struct {
Name string
Position string
}
func main() {
// Sort in Descending order
employees := []Employee{
{"Michael", "Developer"},
{"Jack", "Manager"},
{"Joe", "CEO"},
{"Leonard", "Intern"},
{"Sheldon", "Developer"},
}
sort.SliceStable(employees, func(i, j int) bool {
if employees[i].Position != employees[j].Position {
return employees[i].Position < employees[j].Position
}
return employees[i].Name < employees[j].Name
})
fmt.Println(employees)
// Sort in Ascending order
employees1 := []Employee{
{"Michael", "Developer"},
{"Jack", "Manager"},
{"Joe", "CEO"},
{"Leonard", "Intern"},
{"Sheldon", "Developer"},
}
sort.SliceStable(employees1, func(i, j int) bool {
if employees1[i].Position != employees1[j].Position {
return employees1[i].Position > employees1[j].Position
}
return employees1[i].Name > employees1[j].Name
})
fmt.Println(employees1)
}
上記のコードは、Name
と Position
の両方に基づいて並べ替えます。2 人の従業員の役職が同じ場合は、Name
フィールドに従って並べ替えられます。 構造体のスライスは、降順および昇順でソートされます。
出力を参照してください。
[{Joe CEO} {Michael Developer} {Sheldon Developer} {Leonard Intern} {Jack Manager}]
[{Jack Manager} {Leonard Intern} {Sheldon Developer} {Michael Developer} {Joe CEO}]
Sheeraz is a Doctorate fellow in Computer Science at Northwestern Polytechnical University, Xian, China. He has 7 years of Software Development experience in AI, Web, Database, and Desktop technologies. He writes tutorials in Java, PHP, Python, GoLang, R, etc., to help beginners learn the field of Computer Science.
LinkedIn Facebook関連記事 - Go Slice
- Golang のスライスから要素を削除する方法
- Golang コピー スライス
- Go で空のスライスを作成する
- Go の[]String と...String の違い
- Golang でスライスが要素を含むかどうかをチェックする