Xóa phần tử khỏi 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 35 trên 68.
Đôi khi bạn cần xóa phần tử khỏi tập hợp, và Go giúp việc này trở nên đơn giản với hàm delete() tích hợp sẵn. Vì tập hợp thực chất được triển khai bằng một map bên dưới, nên xóa một phần tử cũng giống như xóa một khóa khỏi map.
Để xóa một phần tử khỏi tập hợp, hãy dùng hàm delete() với tập hợp của bạn và phần tử bạn muốn xóa:
delete(colors, "red")Hàm (function) delete() nhận hai tham số: map (tập hợp của bạn) và khóa bạn muốn xóa. Nếu phần tử tồn tại trong tập hợp, hàm sẽ xóa phần tử đó. Nếu phần tử không tồn tại, hàm sẽ không làm gì cả, không có lỗi nào được đưa ra.
Hành vi này rất phù hợp với tập hợp vì bạn thường muốn đảm bảo một phần tử không tồn tại, bất kể ban đầu phần tử đó có ở đó hay không. Thao tác này nhanh và hiệu quả, đồng thời duy trì lợi ích về hiệu suất từ cách triển khai map nền tảng của Go.
Thử thách
DễXây dựng một hệ thống quản lý sách thư viện có thể xóa sách khỏi các tập hợp thể loại khác nhau bằng cách dùng cách tạo tập hợp trong Go. Thử thách này hướng dẫn cách dùng hàm delete() để xóa phần tử khỏi tập hợp đồng thời theo dõi quá trình xóa.
Bạn sẽ nhận được hai đầu vào:
- Một chuỗi chứa các sách trong bộ sưu tập tiểu thuyết, được phân tách bằng dấu phẩy (ví dụ:
"1984,Dune,Foundation,Neuromancer,Brave New World") - Một chuỗi chứa các sách cần xóa, được phân tách bằng dấu phẩy (ví dụ:
"Dune,Harry Potter,Foundation,Twilight,1984")
Nhiệm vụ của bạn là:
- Tạo một tập hợp bằng cách dùng cách viết trong Go
map[string]struct{}để lưu trữ các sách tiểu thuyết - Phân tích chuỗi đầu vào thứ nhất bằng cách tách chuỗi theo dấu phẩy để lấy từng tên sách
- Thêm từng sách vào tập hợp bằng cách dùng giá trị struct rỗng
{} - Phân tích chuỗi đầu vào thứ hai bằng cách tách chuỗi theo dấu phẩy để lấy danh sách sách cần xóa
- Với mỗi sách cần xóa, kiểm tra xem sách đó có trong tập hợp hay không bằng cách dùng cách viết comma ok
- Hiển thị quá trình xóa cho từng sách đang xử lý:
- Nếu sách có trong bộ sưu tập:
"Removing: [book_title]" - Nếu sách không có trong bộ sưu tập:
"Not found: [book_title]"
- Nếu sách có trong bộ sưu tập:
- Dùng hàm
delete()để xóa các sách có trong tập hợp - Sau khi xử lý tất cả yêu cầu xóa, hiển thị phần tổng kết:
"Initial collection size: [initial_count]""Removal requests: [requests_count]""Books successfully removed: [removed_count]""Books not found: [not_found_count]""Final collection size: [final_count]"
- Cuối cùng, liệt kê tất cả sách còn lại trong bộ sưu tập:
- Tiêu đề:
"Remaining books in fiction collection:" - Mỗi sách trên một dòng riêng:
"- [book_title]" - Nếu không còn sách nào:
"- Collection is empty"
- Tiêu đề:
Dùng package strings để tách các chuỗi đầu vào theo dấu phẩy. Thử thách này hướng dẫn cách hàm delete() xóa phần tử khỏi tập hợp trong Go một cách an toàn. Hàm không báo lỗi ngay cả khi bạn thử xóa phần tử không tồn tại, nên rất phù hợp cho các thao tác dọn dẹp.
Tự làm thử
package main
import (
"bufio"
"fmt"
"os"
"sort"
"strings"
)
func main() {
// Đọc đầu vào bằng Scanner để xử lý tên sách có dấu cách
scanner := bufio.NewScanner(os.Stdin)
scanner.Scan()
fictionBooks := scanner.Text()
scanner.Scan()
booksToRemove := scanner.Text()
// Phân tích các chuỗi đầu vào
fictionList := strings.Split(fictionBooks, ",")
removeList := strings.Split(booksToRemove, ",")
// TODO: Viết code của bạn bên dưới
// 1. Tạo một tập hợp (set) bằng map[string]struct{} để lưu sách hư cấu
// 2. Thêm từng cuốn sách trong fictionList vào tập hợp
// 3. Xử lý từng cuốn sách trong removeList và kiểm tra xem sách có trong tập hợp không
// 4. Hiển thị quá trình xóa và dùng hàm (function) delete()
// 5. Hiển thị số liệu thống kê tổng hợp
// 6. Liệt kê các cuốn sách còn lại trong bộ sưu tập
// Nhớ sắp xếp các cuốn sách còn lại để đầu ra luôn nhất quán
_ = sort.Strings // Xóa dòng này sau khi bạn dùng sort
_ = fmt.Println // Xóa dòng này sau khi bạn dùng fmt
}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