使用HashMap去存储多本图书(HashMap练习)

要求

【HashMap练习】
案例:使用HashMap去存储多本图书
1、 要求定义一个图书类:包括编号、书名,作者和价格进行封装
2、 要求定义一个图书馆类,里面定义一个HashMap对象,键为图书类型的对象,值为价格。
3、 里面定义方法可以实现对图书的添加、删除、查找、修改,遍历
4、 要求图书名称和编号相同的为同一本书

代码

Book 类

public class Book {
	private int bookId;
	private String bookName;
	private String bookAuthor;
	private double bookPrice;
	public Book() {
		super();
	}
	
	public Book(int bookId, String bookName, String bookAuthor) {
		super();
		this.bookId = bookId;
		this.bookName = bookName;
		this.bookAuthor = bookAuthor;
	}

	public Book(int bookId, String bookName, String bookAuthor, double bookPrice) {
		super();
		this.bookId = bookId;
		this.bookName = bookName;
		this.bookAuthor = bookAuthor;
		this.bookPrice = bookPrice;
	}
	public int getBookId() {
		return bookId;
	}
	public void setBookId(int bookId) {
		this.bookId = bookId;
	}
	public String getBookName() {
		return bookName;
	}
	public void setBookName(String bookName) {
		this.bookName = bookName;
	}
	public String getBookAuthor() {
		return bookAuthor;
	}
	public void setBookAuthor(String bookAuthor) {
		this.bookAuthor = bookAuthor;
	}
	public double getBookPrice() {
		return bookPrice;
	}
	public void setBookPrice(double bookPrice) {
		this.bookPrice = bookPrice;
	}

	@Override
	public String toString() {
		return "Book [bookId=" + bookId + ", bookName=" + bookName + ", bookAuthor=" + bookAuthor + ", bookPrice="
				+ bookPrice + "]";
	}

	//实现去重
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + bookId;
		result = prime * result + ((bookName == null) ? 0 : bookName.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Book other = (Book) obj;
		if (bookId != other.bookId)
			return false;
		if (bookName == null) {
			if (other.bookName != null)
				return false;
		} else if (!bookName.equals(other.bookName))
			return false;
		return true;
	}
	 
	
}

Library 类

package com.jihe.exer2;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

public class Library {
	HashMap map = new HashMap();
	
	public HashMap add(Book book,Double price) {
		//PS:注释的是错误的代码
		// 我发现用 KeySet 和 EntrySet,不可以
		/*
		 * map.put(book, price); 
		 * Set entrySet = map.entrySet(); 
		 * Map.Entry entry=(Map.Entry) entrySet; 
		 * Book book1 = (Book) entry.getKey();
		 * book1.setBookPrice(price);
		 */
		map.put(book, price);
		book.setBookPrice(price);
		return map;
	}
	
	public HashMap minus(Book book) {
		map.remove(book);
		return map;
	}
	
	public int search(String name) {
		int a = -1;
		Set keySet = map.keySet();
		Iterator ite = keySet.iterator();
		while(ite.hasNext()) {
			Book book = (Book) ite.next();
			if (book.getBookName().equals(name)) {
				a = book.getBookId();
			}
		}
		return a;
	}
	
	public HashMap modify(Book book,Double price) {
		map.put(book, price);
		book.setBookPrice(price);
		return map;
	}
	
	public void bianli() {
		Set entrySet = map.entrySet();
		
		for (Object o : entrySet) {
			Map.Entry entry = (Entry) o;
			System.out.println(entry.getKey().toString());
		}
	}
}

测试类

package com.jihe.exer2;

public class Test {
	public static void main(String[] args) {
		Library l1 = new Library();
		l1.add(new Book(00,"ONE","one"),100.0);
		//和上一本一样,不论作者和价格
		l1.add(new Book(00,"ONE","one1"),200.0);
		l1.add(new Book(01,"TWO","two"),200.0);
		l1.add(new Book(02,"THREE","three"),300.0);
		l1.add(new Book(03,"FOUR","four"),400.0);
		
		l1.bianli();
		System.out.println();
		l1.minus(new Book(02,"THREE","three"));
		
		l1.bianli();
		System.out.println();
		int id = l1.search("TWO");
		System.out.println(id);
		System.out.println();
		l1.modify(new Book(03,"FOUR","four"), 500.0);
		l1.bianli();
	}
}

结果在这里插入图片描述

疑问

PS: 注释的代码是错误的,
EntrySet 和 KeySet 是只能用来遍历吗?
为什么
map.put(book, price);
book.setBookPrice(price);
实参中的price还是改变了呢?(回答:我是ZZ,学着后面的把基础的引用给忘了)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值