Lặp qua tập hợp
Thuộc phần Logic và luồng điều khiển trong hành trình GO của Coddy. Bài học 36 trên 68.
Giờ đây, khi đã biết cách thêm, kiểm tra và xóa phần tử khỏi tập hợp (set), bạn hãy tìm hiểu cách duyệt qua tất cả các phần tử. Vì tập hợp Go của bạn được xây dựng dựa trên map, bạn có thể dùng vòng lặp (loop) for...range quen thuộc để truy cập từng phần tử.
Để duyệt qua một tập hợp, bạn dùng cú pháp giống như khi duyệt qua một map, nhưng chỉ cần quan tâm đến các khóa:
for color := range colors {
fmt.Println(color)
}Lưu ý rằng ta chỉ dùng một biến trong vòng lặp range. Vì không cần các giá trị (chúng đều là các cấu trúc rỗng), ta có thể hoàn toàn bỏ qua chúng. Câu lệnh này sẽ in ra từng màu trong tập hợp của bạn, mỗi màu trên một dòng.
Bạn cũng có thể dùng dạng hai biến nếu muốn nói rõ rằng mình sẽ bỏ qua giá trị:
for color, _ := range colors {
fmt.Println(color)
}Hãy nhớ rằng map trong Go không đảm bảo thứ tự cụ thể khi lặp qua các phần tử, vì vậy các phần tử trong tập hợp có thể được in ra theo thứ tự khác nhau mỗi lần bạn chạy chương trình. Đây là hành vi hoàn toàn bình thường của tập hợp, vì chúng được thiết kế để kiểm tra tính có mặt của phần tử chứ không phải để duy trì thứ tự.
Thử thách
DễHãy xây dựng một công cụ phân tích danh sách phát nhạc, xử lý các bộ sưu tập bài hát và hiển thị thông tin chi tiết về từng danh sách phát bằng cách dùng tập hợp theo phong cách Go. Thử thách này minh họa cách duyệt qua các tập hợp để kiểm tra và báo cáo nội dung của chúng.
Bạn sẽ nhận được hai đầu vào:
- Một chuỗi chứa các bài hát rock, phân tách bằng dấu phẩy (ví dụ:
"Bohemian Rhapsody,Stairway to Heaven,Hotel California,Sweet Child O Mine") - Một chuỗi chứa các bài hát pop, phân tách bằng dấu phẩy (ví dụ:
"Shape of You,Blinding Lights,Watermelon Sugar,Levitating")
Nhiệm vụ của bạn là:
- Tạo hai tập hợp bằng cách dùng cách viết theo phong cách Go
map[string]struct{}để lưu riêng các bài hát rock và pop - Tách cả hai chuỗi đầu vào tại dấu phẩy để lấy tên từng bài hát
- Thêm từng bài hát vào tập hợp phù hợp, dùng giá trị cấu trúc rỗng
{} - Hiển thị phần phân tích danh sách phát rock:
- Tiêu đề:
"Rock Playlist Analysis:" - Số lượng:
"Total rock songs: [count]" - Tiêu đề các bài hát:
"Songs in rock playlist:" - Mỗi bài hát trên một dòng riêng:
"♪ [song_title]"
- Tiêu đề:
- Hiển thị phần phân tích danh sách phát pop:
- Tiêu đề:
"Pop Playlist Analysis:" - Số lượng:
"Total pop songs: [count]" - Tiêu đề các bài hát:
"Songs in pop playlist:" - Mỗi bài hát trên một dòng riêng:
"♪ [song_title]"
- Tiêu đề:
- Tạo danh sách phát kết hợp bằng cách gộp hai tập hợp vào một tập hợp mới
- Hiển thị phần phân tích danh sách phát kết hợp:
- Tiêu đề:
"Combined Playlist Analysis:" - Số lượng:
"Total unique songs: [count]" - Tiêu đề các bài hát:
"All songs in combined playlist:" - Mỗi bài hát trên một dòng riêng:
"♫ [song_title]"
- Tiêu đề:
- Cuối cùng, hiển thị phần tóm tắt:
"Playlist Summary:""Rock songs: [rock_count]""Pop songs: [pop_count]""Combined unique songs: [combined_count]"
Dùng package strings để tách các chuỗi đầu vào tại dấu phẩy. Để duyệt qua từng tập hợp, hãy dùng vòng lặp for...range với một biến duy nhất để chỉ truy cập các khóa (tên bài hát). Thử thách này minh họa cách duyệt qua các tập hợp trong Go giúp bạn kiểm tra mọi phần tử trong một bộ sưu tập, rất phù hợp cho các tác vụ phân tích và báo cáo.
Tự làm thử
package main
import (
"bufio"
"fmt"
"os"
"sort"
"strings"
)
func main() {
// Đọc từng dòng đầy đủ bằng bufio.Scanner (xử lý được tên bài hát có dấu cách)
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
rockSongs := scanner.Text()
scanner.Scan()
popSongs := scanner.Text()
// Tạo các tập hợp bằng cách viết quen thuộc của Go: map[string]struct{}
rockSet := make(map[string]struct{})
popSet := make(map[string]struct{})
// Tách các chuỗi đầu vào và đưa dữ liệu vào các tập hợp
rockList := strings.Split(rockSongs, ",")
popList := strings.Split(popSongs, ",")
// TODO: Viết code của bạn bên dưới
// Thêm các bài hát vào tập hợp tương ứng
// Hiển thị phân tích danh sách phát rock (sắp xếp bài hát để đầu ra luôn theo cùng một thứ tự)
// Hiển thị phân tích danh sách phát pop (sắp xếp bài hát để đầu ra luôn theo cùng một thứ tự)
// Tạo và hiển thị phân tích danh sách phát kết hợp (sắp xếp bài hát để đầu ra luôn theo cùng một thứ tự)
// Hiển thị tóm tắt danh sách phát
// Lưu ý: Chuyển các khóa của map thành slice, sắp xếp rồi duyệt qua để thứ tự luôn nhất quán
_ = rockSet
_ = popSet
_ = rockList
_ = popList
_ = fmt.Sprintf
_ = sort.Strings
}Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Tất cả bài học trong Logic và luồng điều khiển
1Luồng điều khiển nâng cao
Switch với `fallthrough`Thoát khỏi vòng lặp lồng nhauTiếp tục một vòng lặp cụ thểCâu lệnh `goto`Ôn tập: điều khiển vòng lặp nâng cao4Dự án: Danh sách việc cần làm đơn giản
Thiết lập dự ánThêm một việc cần làm2Struct và phương thức
Định nghĩa phương thức cho structReceiver giá trịReceiver con trỏChọn receiverPhương thức và hàmÔn tập: hành vi của struct5Tìm hiểu chuyên sâu về map
Map chứa structCon trỏ làm giá trị của mapKiểm tra map nilSo sánh các mapÔn tập: bộ đếm tần suất từ8Dự án: Quản lý hàng tồn kho đơn giản
Tổng quan dự ánKiểm tra hàng tồn kho3Interface (cơ bản)
Interface là gì?Định nghĩa interfaceTriển khai interfaceDùng kiểu interfaceInterface rỗngKhẳng định kiểuType switchÔn tập: hình dạng và hành vi6Go theo cách viết thành ngữ: tập hợp
Cách dùng tập hợp trong GoTạo tập hợpThêm phần tử vào tập hợpKiểm tra phần tử có thuộc tập hợp khôngXóa phần tử khỏi tập hợpLặp qua tập hợpÔn tập: tên người dùng duy nhấtTự luyện tập: Trình biên dịch Go online