使用hashmap的问题

时间:2013-12-24 06:58:34

标签: java hashmap

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

4 个答案:

答案 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)

正如已经指出的那样,迭代器不应该在每个循环上重新初始化。它应该只在循环之前初始化一次。

否则,每次执行循环时,它都从地图的第一项开始。