Book Inventory Statistics II


Submit solution

Points: 10 (partial)
Time limit: 1.0s
Memory limit: 64M

Authors:
Problem type
Allowed languages
Java 19, Java 8

題目說明

請撰寫一個 Java 程式,實現一個圖書欄位分析系統。程式將讀取五本書籍的欄位資料,並能根據指定的欄位名稱,計算該欄位中共有幾種不同的內容(相異值的數量)。

程式的運作規則如下:

書籍資料輸入:前 5 行每行輸入一本書的資料,由「書名 (title)」、「作者 (author)」、「類型 (genre)」三個字串組成,以空格分隔。程式會自動將其封裝為 HashMap<String, String> 並存入 ArrayList 中。

分析欄位輸入:第 6 行輸入一個指定的欄位名稱,其值必定為 title、author 或 genre 三者之一。

相異值計算機制:BookAnalyzer 類別必須盤點所有書籍紀錄,擷取每本書在該指定欄位下的字串內容。利用適當的集合容器進行去重,最終計算出該欄位中「共有幾種不同的項目」。

輸出結果:輸出一行整數數字,代表該指定欄位中相異內容的總種數。

請利用下方的樣板程式碼為基礎,在標記 // TODO 的空格處填入關鍵程式碼以完成上述功能。

參考程式碼

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Scanner;

public class LibrarySystem {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        ArrayList<HashMap<String, String>> books = BookCollector.getInputData(scanner, 5);

        // 取得要統計相異值數量的欄位名稱
        String category = scanner.next();
        scanner.close();

        // 建立 BookAnalyzer 實體並計算該欄位的相異內容種數
        BookAnalyzer analyzer = new BookAnalyzer(books);
        int distinctCount = analyzer.countDistinctValues(category);

        // 印出最終種類數量
        System.out.println(distinctCount);
    }
}

class BookCollector {
    public static ArrayList<HashMap<String, String>> getInputData(Scanner scanner, int numberOfBooks) {
        ArrayList<HashMap<String, String>> books = new ArrayList<>();
        for (int i = 0; i < numberOfBooks; i++) {
            HashMap<String, String> book = new HashMap<>();
            String title = scanner.next();
            String author = scanner.next();
            String genre = scanner.next();
            book.put("title", title);
            book.put("author", author);
            book.put("genre", genre);
            books.add(book);
        }
        return books;
    }
}

class BookAnalyzer {
    private ArrayList<HashMap<String, String>> books;

    // 建構子初始化資料
    public BookAnalyzer(ArrayList<HashMap<String, String>> books) {
        this.books = books;
    }

    // 計算指定欄位中共有幾種不同的內容
    public int countDistinctValues(String categoryName) {
        // TODO: 宣告一個適當的唯一的集合容器,用於自動去除重複的字串內容


        // TODO: 盤點 books 容器,將每本書在指定欄位(categoryName)的值取出並存入集合中


        // TODO: 傳回該集合中元素的總數量
        return 0;
    }
}

輸入值的格式

輸入共 6 行,格式如下:

  • 前 5 行:每行輸入一本書的資料,由「書名」、「作者」、「類型」三個字串組成,以空格分隔。
  • 第 6 行:輸入要統計的欄位名稱,其值為 title、author 或 genre 三者之一。

輸出值的格式

輸出一行整數數字,代表該指定欄位中相異內容的總種數。

sample input1

gatsby fitzgerald fiction
hamlet shakespeare drama
pride austen fiction
othello shakespeare drama
emma austen fiction
author

sample output1

3

說明:指定的欄位是 author。五本書的作者分別為 fitzgerald, shakespeare, austen, shakespeare, austen。其中不重複的作者共有三種(fitzgerald, shakespeare, austen),故輸出 3。

sample input2

sherlock doyle mystery
poirot christie mystery
holmes doyle mystery
marple christie mystery
spade hammett noir
genre

sample output2

2

說明:指定的欄位是 genre。五本書的類型分別為 mystery, mystery, mystery, mystery, noir。其中不重複的類型共有兩種(mystery, noir),故輸出 2。


Comments

There are no comments at the moment.