import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
class Books {
private String title, author, publisher;
public Books(String title, String author, String publisher) {
this.title = title;
this.author = author;
this.publisher = publisher;
}
public String toString() {
return "\nTitle: " + title + "\nAuthor: " + author + "\nPublisher: " + publisher + "\n";
}
}
class Collections {
private String title, author, publisher;
Scanner sc = new Scanner(System.in);
static Map<String, Books> hashmap = new LinkedHashMap<String, Books>();
void reg() {
System.out.println(">>Please input the Title = ");
title = sc.nextLine();
System.out.println(">>Please input Author = ");
author = sc.nextLine();
System.out.println(">>Please input Publisher = ");
publisher = sc.nextLine();
hashmap.put(title, new Books(title, author, publisher));
System.out.println();
}
Set<String> set = hashmap.keySet();
void load() {
for (int i = 0; i < set.size(); i++) {
System.out.println("Book" + (i + 1) + "\n");
Iterator<String> iter = set.iterator();
Books b = hashmap.get(iter.next());
System.out.println(b.toString());
}
}
void search() {
System.out.println("Please enter title: ");
title = sc.nextLine();
Books b = hashmap.get(title);
System.out.println(b.toString());
System.out.println();
}
}
public class LibraryManage1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Collections collections = new Collections();
boolean run = true;
int select;
while (run) {
System.out.println("--------------------Library Management Program----------------------");
System.out.printf("1. Book collections\n2. Register new books\n3. Search a book\n4. Exit");
System.out.println("--------------------------------------------------------------------");
System.out.println(">>Please select menu : ");
select = sc.nextInt();
switch (select) {
case 1:
collections.load();
break;
case 2:
collections.reg();
break;
case 3:
collections.search();
break;
case 4:
System.out.println(">>Thank you for running my program!");
run = false;
break;
}
}
}
}
这是我的大学作业的简单图书馆管理程序,我只能使用HashMap。 我的问题是,当我尝试加载到目前为止我输入的每本书时,标题,作者和出版商只出自我注册的第一本书。
所以,为了澄清自己,例如当我输入两本这样的书时,
第一册 标题:A 作者:A 出版商:A
第二册 标题:B 作者:B 出版商:B
当我尝试加载到目前为止我输入的每本书时,结果都是这样的,
第一册 标题:A 作者:A 出版商:A
第二册 标题:A 作者:A 出版商:A
答案 0 :(得分:4)
为了怜悯,请以单数命名你的班级!即Book
,而不是Books
!
每个循环都在打开一个新的迭代器。相反,使用foreach循环:
int count = 0;
for (String title : set) {
System.out.println("Book"+(++count)+"\n");
Books b = hashmap.get(title);
System.out.println(b); // don't to call `toString()` - println does that for you
}
或更好地迭代值:
int count = 0;
for (Book b : hashmap.values()) {
System.out.println("Book"+(++count)+"\n");
System.out.println(b);
}
完全避免查找。
答案 1 :(得分:2)
当你调用set.iterator()
时,你创建了新的迭代器,它引用了第一个元素。因此iter.next()
每次返回第一个元素。
Iterator<String> iter = set.iterator() ;
void load(){
for(int i = 0 ; i<set.size();i++){
System.out.println("Book"+(i+1)+"\n");
//Iterator<String> iter = set.iterator() ;
Books b = hashmap.get(iter.next());
System.out.println(b.toString());
}
}
答案 2 :(得分:2)
在Books中实现hashCode()
方法,可能是这样的 -
public int hashCode() {
return author.hashCode() ^ title.hashCode() ^ publisher.hashCode();
}
您还应该实现等于
public boolean equals(Books in) {
if (this == in) return true;
return this.author.equals(in.author) && this.title.equals(in.title) //
&& this.publisher.equals(in.publisher);
}
答案 3 :(得分:1)
正如已经指出的那样,迭代器不应该在每个循环上重新初始化。它应该只在循环之前初始化一次。
否则,每次执行循环时,它都从地图的第一项开始。