CFSDN nhấn mạnh vào việc tạo ra giá trị thông qua mã nguồn mở. Chúng tôi cam kết xây dựng một nền tảng chia sẻ tài nguyên để mọi người làm CNTT có thể tìm thấy thế giới tuyệt vời của riêng mình tại đây.
Bài đăng trên blog CFSDN này về giải pháp sắp xếp các kiểu tùy chỉnh của Golang được tác giả thu thập và sắp xếp. Nếu bạn quan tâm đến bài viết này, hãy nhớ thích nó.
Lời nói đầu.
Ngôn ngữ Go hỗ trợ các kiểu tùy chỉnh. Trong các dự án thực tế, chúng ta thường cần sắp xếp theo một trường của một kiểu cấu trúc. Tôi đã gặp phải vấn đề này trước đây và không biết cách giải quyết. Sau đó, tôi đã tìm kiếm các vấn đề liên quan trên Internet và tìm thấy một số giải pháp tốt. Sau đây là tài liệu tham khảo và tóm tắt.
Vì gói golang sort tự cung cấp các hàm tương ứng nên không cần phải phát minh lại bánh xe. Hãy cùng xem cách sử dụng gói sort để đạt được điều đó.
Một cuộc thảo luận ngắn gọn về gói sắp xếp.
Golang cũng triển khai gói sort cho các thuật toán sắp xếp. Gói sort triển khai bốn thuật toán sắp xếp cơ bản bên trong: sắp xếp chèn (insertionSort), sắp xếp trộn (symMerge), sắp xếp đống (heapSort) và sắp xếp nhanh (quickSort); gói sort sẽ tự động chọn thuật toán sắp xếp tối ưu dựa trên dữ liệu thực tế.
Vì vậy, khi viết code, chúng ta chỉ cần cân nhắc triển khai kiểu sort.Interface.
Hãy xem nhanh gói sắp xếp.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
hai mươi mốt
hai mươi hai
hai mươi ba
hai mươi bốn
25
26
27
28
|
func Sort(giao diện dữ liệu) {
n := dữ liệu. Len()
Độ sâu tối đa := 0
vì
tôi := n; tôi > 0; tôi >>= 1 {
Độ sâu tối đa++
}
Độ sâu tối đa *= 2
quickSort(dữ liệu, 0, n, maxDepth)
}
loại Giao diện giao diện {
Len()
số nguyên
Ít hơn(i, j
số nguyên
)
bool
Hoán đổi(i, j
số nguyên
)
}
func insertSort(giao diện dữ liệu, a, b
số nguyên
)
func heapSort(giao diện dữ liệu, a, b
số nguyên
)
func quickSort(giao diện dữ liệu, a, b, maxDepth
số nguyên
)
func symMerge(giao diện dữ liệu, a, m, b
số nguyên
)
|
Vì vậy, để gọi sort.Sort() để triển khai sắp xếp kiểu tùy chỉnh, chúng ta chỉ cần kiểu của mình để triển khai ba phương thức trong kiểu giao diện Interface.
Trước tiên chúng ta hãy xem cách gói sort sắp xếp kiểu []int.
?
1
2
3
4
5
6
7
8
9
10
11
|
kiểu IntSlice[]
số nguyên
hàm (p IntSlice) Len()
số nguyên
{
trở lại
dài(p) }
func (p IntSlice) Ít hơn(i, j
số nguyên
)
bool
{
trở lại
p[i] < p[j] }
func (p IntSlice) Swap(i, j
số nguyên
) { p[i], p[j] = p[j], p[i] }
hàm Ints(a []
số nguyên
) { Sắp xếp(IntSlice(a)) }
|
Theo cùng một mô hình, hãy sắp xếp loại cấu trúc tùy chỉnh theo thứ tự giảm dần.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
hai mươi mốt
hai mươi hai
hai mươi ba
hai mươi bốn
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
gói chính
nhập khẩu (
"fmt"
"loại"
)
loại Người
cấu trúc
{
Chuỗi tên
Tuổi
số nguyên
}
loại Người []Người
func (p Người) Len()
số nguyên
{
trở lại
dài(p) }
func (p Người) Ít hơn(i, j
số nguyên
)
bool
{
trở lại
p[i].Tuổi > p[j].Tuổi
}
func (p Người) Swap(i, j
số nguyên
) { p[i], p[j] = p[j], p[i] }
hàm main() {
người := Người{
{
Tên:
"kiểm tra 1"
,
Tuổi: 20,
},
{
Tên:
"kiểm tra 2"
,
Tuổi: 22,
},
{
Tên:
"kiểm tra 3"
,
Tuổi: 21,
},
}
fmt.Println(
"Trước khi phân loại"
)
vì
_, người := phạm vi người {
fmt.Println(người.Tên,
":"
, người.Tuổi)
}
sort.Sắp xếp(người)
fmt.Println(
"Sau khi phân loại"
)
vì
_, người := phạm vi người {
fmt.Println(người.Tên,
":"
, người.Tuổi)
}
}
|
Trên thực tế, nhìn chung Len() và Swap() về cơ bản không thay đổi, chỉ có phương thức Less() liên quan đến việc so sánh phần tử là thay đổi.
Chúng ta nên làm gì khi sắp xếp nhiều trường trong một cấu trúc? Chúng ta có cần phải viết ra ba phương pháp này cho mỗi lần sắp xếp không? Tất nhiên là không. Chúng ta có thể sử dụng các cấu trúc lồng nhau để giải quyết vấn đề này. Bởi vì các cấu trúc lồng nhau có thể kế thừa tất cả các thuộc tính và phương thức của cấu trúc cha.
Ví dụ, nếu tôi muốn sắp xếp cặp trường Tên và Tuổi của Người ở trên, chúng ta có thể sử dụng các cấu trúc lồng nhau để cải thiện nó.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
hai mươi mốt
hai mươi hai
hai mươi ba
hai mươi bốn
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
gói chính
nhập khẩu (
"fmt"
"loại"
)
loại Người
cấu trúc
{
Chuỗi tên
Tuổi
số nguyên
}
loại Người []Người
func (p Người) Len()
số nguyên
{
trở lại
dài(p) }
func (p Người) Swap(i, j
số nguyên
) { p[i], p[j] = p[j], p[i] }
loại SortByName
cấu trúc
{ Người }
func (p SortByName) Ít hơn(i, j
số nguyên
)
bool
{
trở lại
len(p. Người[i].Tên) > len(p. Người[j].Tên)
}
loại SortByAge
cấu trúc
{ Người }
func (p Sắp xếp theo độ tuổi) Ít hơn(i, j
số nguyên
)
bool
{
trở lại
p.Người[i].Tuổi > p.Người[j].Tuổi
}
hàm main() {
người := Người{
{
Tên:
"kiểm tra123"
,
Tuổi: 20,
},
{
Tên:
"kiểm tra 1"
,
Tuổi: 22,
},
{
Tên:
"kiểm tra 12"
,
Tuổi: 21,
},
}
fmt.Println(
"Trước khi phân loại"
)
vì
_, người := phạm vi người {
fmt.Println(người.Tên,
":"
, người.Tuổi)
}
sort.Sort(SortByName{người})
fmt.Println(
"Sau khi phân loại"
)
vì
_, người := phạm vi người {
fmt.Println(người.Tên,
":"
, người.Tuổi)
}
}
|
Tóm tắt.
Trên đây là toàn bộ nội dung bài viết này, hy vọng nội dung bài viết này có giá trị tham khảo nhất định cho việc học tập hoặc công tác của bạn. Nếu có thắc mắc gì, bạn có thể để lại lời nhắn để trao đổi. Cảm ơn sự ủng hộ của bạn.
Liên kết gốc: http://www.itzh.org/2017/12/26/golang_sorts_the_custom_type/.
Cuối cùng, bài viết này về giải pháp sắp xếp kiểu tùy chỉnh của Golang kết thúc tại đây. Nếu bạn muốn biết thêm về giải pháp sắp xếp kiểu tùy chỉnh của Golang, vui lòng tìm kiếm các bài viết của CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .
Tôi là một lập trình viên xuất sắc, rất giỏi!