検索機能
CoddyのJavaジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 80/87。
チャレンジ
簡単強力な検索機能を追加して、Library Management System を拡張しましょう!ユーザーが探している本を見つけられなければ、図書館はあまり役に立ちません。タイトルと著者で検索するメソッドを追加して、図書館を本当に実用的なものにしましょう。
既存のコードを4つのファイルにわたって引き続き構築していきます。
Book.java: 既存のすべての機能(isbn、title、author、isAvailable、borrowedBy、getDetails()、および適切な getter/setter)を備えた Book クラスを維持します。まだ追加していない場合は、titleとauthorの getter メソッドを用意してください。User.java: id、name、borrowedBooks ArrayList、borrowBook()、returnBook()、getBorrowedCount()、toString() を含む User クラスは変更せずに維持します。Library.java: 検索機能を備えるように Library クラスを拡張します。既存のすべてのメソッド(addBook、registerUser、findBookByIsbn、findUserById、borrowBook、returnBook)を維持し、次の新しい検索メソッドを追加します。searchByTitle(String keyword)- タイトルにキーワードが含まれるすべての本(大文字と小文字を区別しない)を含むArrayList<Book>を返します。比較にはタイトルとキーワードの両方にtoLowerCase()を使用します。searchByAuthor(String keyword)- 著者名にキーワードが含まれるすべての本(大文字と小文字を区別しない)を含むArrayList<Book>を返します。getAvailableBooks()- 現在貸し出し可能な本だけを含むArrayList<Book>を返します。Main.java: 検索システムを実演します!3冊の本(それぞれ ISBN、タイトル、著者)の入力を受け取り、続いてユーザー(ID、名前)、貸し出し操作、2つの検索クエリを受け取ります。Library を作成し、3冊すべての本を追加して、ユーザーを登録します。貸し出し操作(
userId:isbn形式)を処理します。その後、2つの検索を実行します。最初の入力はタイトルのキーワード、2番目の入力は著者のキーワードです。結果を次の順序で出力します。
- 貸し出し後、貸し出し確認を出力する
Title search '[keyword]':を出力し、その後に一致する各本の詳細を別々の行に出力する(getDetails() を使用)。一致する本がない場合はNo books foundを出力するAuthor search '[keyword]':を出力し、その後に一致する各本の詳細を出力する。一致する本がない場合はNo books foundを出力するAvailable books:を出力し、その後に貸し出し可能な各本の詳細を出力する
入力は次の順序で受け取ります。book1 ISBN、book1 title、book1 author、book2 ISBN、book2 title、book2 author、book3 ISBN、book3 title、book3 author、ユーザー ID、ユーザー名、貸し出し操作、タイトル検索キーワード、著者検索キーワード。
たとえば、入力が ISBN-001、Clean Code、Robert Martin、ISBN-002、The Clean Coder、Robert Martin、ISBN-003、Design Patterns、Gang of Four、U001、Alice、U001:ISBN-001、clean、martin の場合、出力は次のようになります。
Alice borrowed Clean Code
Title search 'clean':
[ISBN-001] Clean Code by Robert Martin
[ISBN-002] The Clean Coder by Robert Martin
Author search 'martin':
[ISBN-001] Clean Code by Robert Martin
[ISBN-002] The Clean Coder by Robert Martin
Available books:
[ISBN-002] The Clean Coder by Robert Martin
[ISBN-003] Design Patterns by Gang of Four検索メソッドが大文字と小文字を区別しない一致を使用していることに注目してください。"clean" を検索すると、"Clean Code" と "The Clean Coder" の両方が見つかります。貸し出し可能な本の一覧からは、貸し出し中の本が正しく除外されています。これらの検索機能によって、図書館は単なる本の集合から、本当に使いやすいシステムへと変わります。
自分で試してみよう
import java.util.Scanner;
import java.util.ArrayList;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 本1の情報を読み取る
String isbn1 = scanner.nextLine();
String title1 = scanner.nextLine();
String author1 = scanner.nextLine();
// 本2の情報を読み取る
String isbn2 = scanner.nextLine();
String title2 = scanner.nextLine();
String author2 = scanner.nextLine();
// 本3の情報を読み取る
String isbn3 = scanner.nextLine();
String title3 = scanner.nextLine();
String author3 = scanner.nextLine();
// ユーザー情報を読み取る
String userId = scanner.nextLine();
String userName = scanner.nextLine();
// 貸出操作を読み取る
String borrowOp = scanner.nextLine();
// 検索キーワードを読み取る
String titleKeyword = scanner.nextLine();
String authorKeyword = scanner.nextLine();
// Bookオブジェクトを作成
Book book1 = new Book(isbn1, title1, author1);
Book book2 = new Book(isbn2, title2, author2);
Book book3 = new Book(isbn3, title3, author3);
// Userオブジェクトを作成
User user = new User(userId, userName);
// Libraryを作成し、本とユーザーを追加
Library library = new Library();
library.addBook(book1);
library.addBook(book2);
library.addBook(book3);
library.registerUser(user);
// 貸出操作を処理
String[] parts = borrowOp.split(":");
String opUserId = parts[0];
String opIsbn = parts[1];
library.borrowBook(opUserId, opIsbn);
// TODO: タイトル検索
// Print "Title search '[titleKeyword]':"
// library.searchByTitle(titleKeyword)を使用
// Print each book's getDetails(), or "No books found" if empty
// TODO: Author search
// Print "Author search '[authorKeyword]':"
// library.searchByAuthor(authorKeyword) を使用する
// Print each book's getDetails(), or "No books found" if empty
// TODO: Available books
// Print "Available books:"
// Use library.getAvailableBooks()
// 各本の getDetails() を出力する
}
}オブジェクト指向プログラミングのすべてのレッスン
4継承
継承の基本 (extends)super キーワードメソッドのオーバーライド (@Override)コンストラクタチェーンObject クラス単一継承と多段階継承なぜ多重継承ができないのかまとめ:従業員の階層構造自分で練習してみよう: Javaオンラインコンパイラ