Menu
CoddyTech

Ôn tập: vùng chứa tổng quát

Thuộc phần Lập trình hướng đối tượng trong hành trình Java của Coddy. Bài học 58 trên 87.

challenge icon

Thử thách

Dễ

Hãy cùng xây dựng một hệ thống lưu trữ linh hoạt, kết hợp mọi điều bạn đã học về kiểu tổng quát! Bạn sẽ tạo một lớp Container có thể lưu trữ, truy xuất và xử lý các phần tử thuộc mọi kiểu dữ liệu, cùng với các phương thức tiện ích minh họa cách hoạt động của ký tự đại diện.

Bạn sẽ sắp xếp code trong ba tệp:

  • Container.java: Tạo một lớp tổng quát Container<T> để quản lý một tập hợp các mục. Bên trong, bộ chứa của bạn cần dùng ArrayList<T> để lưu trữ các phần tử. Thêm các phương thức add(T item) để thêm một phần tử, get(int index) để truy xuất phần tử ở một vị trí cụ thể, size() để trả về số lượng mục và isEmpty() để kiểm tra xem bộ chứa có phần tử nào không. Đồng thời thêm phương thức getAll() để trả về danh sách bên trong.
  • ContainerUtils.java: Tạo một lớp tiện ích có các phương thức tổng quát tĩnh hoạt động với bộ chứa của bạn:

    printAll(Container<?> container) - Dùng ký tự đại diện không giới hạn để in ra mọi phần tử trong bất kỳ bộ chứa nào, mỗi phần tử trên một dòng.

    countItems(Container<? extends Number> container) - Dùng ký tự đại diện có giới hạn trên để tính tổng mọi giá trị số trong bộ chứa, rồi trả về kết quả dưới dạng double.

    addDefaults(Container<? super Integer> container) - Dùng ký tự đại diện có giới hạn dưới để thêm các số nguyên 1, 2 và 3 vào bất kỳ bộ chứa nào có thể chứa số nguyên.

    <T> T getLastOrDefault(Container<T> container, T defaultValue) - Một phương thức tổng quát trả về phần tử cuối cùng trong bộ chứa, hoặc giá trị mặc định nếu bộ chứa rỗng.

  • Main.java: Kết hợp hệ thống bộ chứa tổng quát của bạn! Bạn sẽ nhận ba đầu vào: một từ (String), một số nguyên và một số thực double.

    Trước tiên, tạo một Container<String> và thêm từ đó vào hai lần. In ra String container:, sau đó dùng printAll để hiển thị nội dung.

    Tiếp theo, tạo một Container<Double> và thêm giá trị double vào đó. In ra một dòng trống, sau đó in Number sum: [sum] bằng sumValues.

    Sau đó, tạo một Container<Number> và gọi addDefaults trên bộ chứa đó. In ra một dòng trống, sau đó in After adding defaults: và dùng printAll để hiển thị nội dung.

    Cuối cùng, tạo một Container<Integer> rỗng và dùng getLastOrDefault với đầu vào số nguyên làm giá trị mặc định. In ra một dòng trống, sau đó in Last or default: [result].

Bạn sẽ nhận ba đầu vào theo thứ tự: một từ (String), một số nguyên và một số thực double.

Thử thách này kết hợp lớp tổng quát, phương thức tổng quát, tham số kiểu có giới hạn và cả ba kiểu ký tự đại diện. Hãy chú ý cách mỗi phần đảm nhiệm một mục đích khác nhau: lớp tổng quát cung cấp khả năng lưu trữ an toàn về kiểu dữ liệu, ký tự đại diện có giới hạn cho phép đọc và ghi linh hoạt, còn phương thức tổng quát cung cấp các thao tác có thể tái sử dụng trên nhiều kiểu bộ chứa!

Tự làm thử

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        
        // Đọc các giá trị đầu vào
        String word = scanner.nextLine();
        int intValue = Integer.parseInt(scanner.nextLine());
        double doubleValue = Double.parseDouble(scanner.nextLine());
        
        // TODO: Tạo một Container<String> và thêm word hai lần
        // In ra "String container:", rồi dùng ContainerUtils.printAll()
        
        // TODO: Tạo một Container<Double> và thêm giá trị double
        // In ra một dòng trống, rồi dùng ContainerUtils.countItems() để in ra "Number sum: [sum]"
        
        // TODO: Tạo một Container<Number> và gọi ContainerUtils.addDefaults() trên đó
        // In ra một dòng trống, rồi in ra "After adding defaults:" và dùng ContainerUtils.printAll()
        
        // TODO: Tạo một Container<Integer> rỗng
        // Dùng ContainerUtils.getLastOrDefault() với intValue làm giá trị mặc định
        // In ra một dòng trống, rồi in ra "Last or default: [result]"
    }
}

Tất cả bài học trong Lập trình hướng đối tượng

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