要求
【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,学着后面的把基础的引用给忘了)