Menu
CoddyTech

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.

challenge icon

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à:

  1. 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
  2. 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
  3. Thêm từng sách vào tập hợp bằng cách dùng giá trị struct rỗng {}
  4. 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
  5. 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
  6. 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]"
  7. Dùng hàm delete() để xóa các sách có trong tập hợp
  8. 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]"
  9. 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"

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
}
quiz iconTự kiểm tra

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

Tự luyện tập: Trình biên dịch Go online