Tôi gặp sự cố khi sắp xếp chuỗi theo ký tự (để kiểm tra xem hai chuỗi là đảo chữ cái, tôi muốn sắp xếp cả hai chuỗi đó và kiểm tra tính bình đẳng).Đi sắp xếp một phần của rune?
tôi có thể có được một đại diện []rune
của chuỗi s
như thế này:
runes := make([]rune, len(s))
copy(runes, []rune(s))
Và tôi có thể sắp xếp ints như thế này
someInts := []int{5, 2, 6, 3, 1, 4} // unsorted
sort.Ints(someInts)
Nhưng rune
chỉ là một bí danh cho int32
vì vậy tôi nên có thể gọi
sort.Ints(runes)
Tuy nhiên, tôi gặp lỗi:
cannot use runes (type []rune) as type []int in function argument
Vậy ... làm cách nào để sắp xếp một phần int32, int64 hoặc int *?
EDIT: Tôi đã nhận được rune của tôi được sắp xếp, nhưng cậu bé, điều này là xấu xí.
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)
}
Vì vậy, về cơ bản nếu bạn có một lát bất kỳ thứ gì, bạn sẽ phải gói nó theo kiểu thực hiện sort.Interface
. Tất cả những triển khai đó sẽ có cùng các đối tượng phương thức giống hệt nhau (như sort.IntSlice
và sort.Float64Slice
). Nếu điều này thực sự xấu xí như thế nào thì tại sao họ không cung cấp các trình bao bọc WhateverSlice này trong gói sort
? Việc thiếu generics bắt đầu làm tổn thương rất nặng nề. Phải có cách phân loại tốt hơn.
Vâng, đó là một sự vi phạm khủng khiếp của DRY. Tôi có nghĩa là có chính xác cùng một mã nhân rộng nhiều lần như có các loại cơ bản là khá xấu. Thuật toán sắp xếp chung hoạt động trên các loại cơ bản mà không cần thêm bất kỳ khâu nào là khá nhiều điều bạn mong đợi ở bất kỳ ngôn ngữ nào. Nhưng phải dạy cho trình biên dịch cách lấy chiều dài của một lát 20 lần là không thật. – andras
Bạn đang thiếu điểm hoàn toàn. Thuật toán sắp xếp chung hoạt động không chỉ cho các slice, mà còn cho _anything_ thỏa mãn 'sort.Interface'. Bây giờ, làm thế nào để bạn đề xuất để automagically nhận được 'Len' và bạn bè của _anything_ bạn biết _nothing_ về trước (tại thời gian biên dịch) ??? IOW, rant của bạn không hợp lý. – zzzz
Tôi không mong đợi trình biên dịch có thể sắp xếp các trường hợp 'BucketOfFish' ra khỏi hộp. 'sort.Interface' có vẻ như là một trừu tượng tốt đẹp cho các trường hợp này (mặc dù tôi có thể muốn giữ Fishes của tôi trong các slice cũng như, thay vì một số container tùy chỉnh). Tôi chỉ tìm thấy nó lạ rằng một trường hợp sử dụng cơ bản (lát của một loại cơ bản) không được bảo hiểm bởi thư viện chuẩn. – andras