Java基础之集合框架——使用HashMap地图(TryPhoneBook1)
2013-11-18 23:06
387 查看
控制台程序。
首先改进Peron类,使Person可以在地图中用作键,进而存储电话簿中的项。必须添加equals()方法并重写默认的hashCode()方法。
对于可在散列表中用作键的自定义类对象来说,必须重写Object类的equals()方法。该方法有HashMap<>类中的方法用于确定两个键何时相等。
还可以重写默认的hashCode()方法,将对象的散列值返回为int类型。这个hashCode()方法用于生成一个值,从而确定键/值位于什么地方。
首先改进Peron类,使Person可以在地图中用作键,进而存储电话簿中的项。必须添加equals()方法并重写默认的hashCode()方法。
import java.io.*; public class Person implements Comparable<Person>, Serializable { // Constructor public Person(String firstName, String surname) { this.firstName = firstName; this.surname = surname; } @Override public String toString() { return firstName + " " + surname; } // Compare Person objects public int compareTo(Person person) { int result = surname.compareTo(person.surname); return result == 0 ? firstName.compareTo(person.firstName) : result; } @Override public boolean equals(Object person) { return compareTo((Person)person) == 0; } @Override public int hashCode() { return 7*firstName.hashCode()+13*surname.hashCode(); } // Read a person from the keyboard public static Person readPerson() { String firstName = null; String surname = null; try { System.out.print("Enter first name: "); firstName = keyboard.readLine().trim(); System.out.print("Enter surname: "); surname = keyboard.readLine().trim(); } catch(IOException e) { System.err.println("Error reading a name."); e.printStackTrace(System.err); System.exit(1); } return new Person(firstName,surname); } private String firstName; // First name of person private String surname; // Second name of person private static final long serialVersionUID = 1001L; private static BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in)); }
对于可在散列表中用作键的自定义类对象来说,必须重写Object类的equals()方法。该方法有HashMap<>类中的方法用于确定两个键何时相等。
还可以重写默认的hashCode()方法,将对象的散列值返回为int类型。这个hashCode()方法用于生成一个值,从而确定键/值位于什么地方。
import java.io.*; class PhoneNumber implements Serializable { public PhoneNumber(String areacode, String number) { this.areacode = areacode; this.number = number; } @Override public String toString() { return areacode + " " + number; } // Read a phone number from the keyboard public static PhoneNumber readNumber() { String area = null; // Stores the area code String localcode = null; // Stores the local code try { System.out.print("Enter area code: "); area = keyboard.readLine().trim(); System.out.print("Enter local code: "); localcode = keyboard.readLine().trim(); System.out.print("Enter the number: "); localcode += " " + keyboard.readLine().trim(); } catch(IOException e) { System.err.println("Error reading a phone number."); e.printStackTrace(); System.exit(1); } return new PhoneNumber(area,localcode); } private String areacode; private String number; private static final long serialVersionUID = 1001L; private static BufferedReader keyboard = new BufferedReader(new InputStreamReader(System.in)); }
import java.io.Serializable; class BookEntry implements Serializable { public BookEntry(Person person, PhoneNumber number) { this.person = person; this.number = number; } public Person getPerson() { return person; } public PhoneNumber getNumber() { return number; } @Override public String toString() { return person.toString() + '\n' + number.toString(); } // Read an entry from the keyboard public static BookEntry readEntry() { return new BookEntry(Person.readPerson(), PhoneNumber.readNumber()); } private Person person; private PhoneNumber number; private static final long serialVersionUID = 1001L; }
import java.io.Serializable; import java.util.HashMap; class PhoneBook implements Serializable { public void addEntry(BookEntry entry) { phonebook.put(entry.getPerson(), entry); } public BookEntry getEntry(Person key) { return phonebook.get(key); } public PhoneNumber getNumber(Person key) { BookEntry entry = getEntry(key); if(entry != null) { return entry.getNumber(); } else { return null; } } private HashMap<Person,BookEntry> phonebook = new HashMap<>(); private static final long serialVersionUID = 1001L; }
import java.io.StreamTokenizer; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; public class FormattedInput { public int readInt() throws InvalidUserInputException { if (readToken() != StreamTokenizer.TT_NUMBER) { throw new InvalidUserInputException("readInt() failed." + "Input data not numeric"); } if (tokenizer.nval > (double) Integer.MAX_VALUE || tokenizer.nval < (double) Integer.MIN_VALUE) { throw new InvalidUserInputException("readInt() failed." + "Input outside range of type int"); } if (tokenizer.nval != (double) (int) tokenizer.nval) { throw new InvalidUserInputException("readInt() failed." + "Input not an integer"); } return (int) tokenizer.nval; } public double readDouble() throws InvalidUserInputException { if (readToken() != StreamTokenizer.TT_NUMBER) { throw new InvalidUserInputException("readDouble() failed." + "Input data not numeric"); } return tokenizer.nval; } public String readString() throws InvalidUserInputException { if (readToken() == StreamTokenizer.TT_WORD || ttype == '\"' || ttype == '\"') { return tokenizer.sval; } else { throw new InvalidUserInputException("readString() failed." + "Input data is not a string"); } } // Plus methods to read various other data types... // Helper method to read the next token private int readToken() { try { ttype = tokenizer.nextToken(); return ttype; } catch (IOException e) { // Error reading in nextToken() e.printStackTrace(); System.exit(1); // End the program } return 0; } // Object to tokenize input from the standard input stream private StreamTokenizer tokenizer = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); private int ttype; // Stores the token type code }
public class InvalidUserInputException extends Exception { public InvalidUserInputException() { } public InvalidUserInputException(String message) { super(message); } private static final long serialVersionUID = 9876L; }
public class TryPhoneBook { public static void main(String[] args) { PhoneBook book = new PhoneBook(); // The phone book FormattedInput in = new FormattedInput(); // Keyboard input Person someone; while(true) { System.out.println("Enter 1 to enter a new phone book entry\n"+ "Enter 2 to find the number for a name\n"+ "Enter 9 to quit."); int what = 0; // Stores input selection try { what = in.readInt(); } catch(InvalidUserInputException e) { System.out.println(e.getMessage()+"\nTry again."); continue; } switch(what) { case 1: book.addEntry(BookEntry.readEntry()); break; case 2: someone = Person.readPerson(); BookEntry entry = book.getEntry(someone); if(entry == null) { System.out.println("The number for " + someone + " was not found."); } else { System.out.println("The number for " + someone + " is " + entry.getNumber()); } break; case 9: System.out.println("Ending program."); return; default: System.out.println("Invalid selection, try again."); break; } } } }
相关文章推荐
- Java基础之集合框架——在文件中存储地图(TryPhoneBook2)
- JAVA基础--JAVA API集合框架(ArrayList、HashSet、HashMap使用)14
- 黑马程序员 java 基础 毕向东 面向对象 集合框架 Map HashTable HashMap TreeMap
- java语言基础(75)——集合框架(Set集合的概述及使用)
- Java 集合框架--HashMap详细介绍和使用总结
- Java基础知识强化之集合框架笔记79:HashMap的实现原理
- Java基础知识强化之集合框架笔记54:Map集合之HashMap集合(HashMap<String,String>)的案例
- Java基础知识强化之集合框架笔记80:HashMap的线程不安全性的体现
- Java基础之集合框架——使用堆栈Stack<>对象模拟发牌(TryDeal)
- Java基础知识强化之集合框架笔记09:Collection集合迭代器使用的问题探讨
- Java基础之集合框架(三)--Map、HashMap、TreeMap
- Java基础知识强化之集合框架笔记64:Map集合之ArrayList嵌套HashMap
- Java基础知识强化之集合框架笔记57:Map集合之HashMap集合(HashMap<Student,String>)的案例
- Java基础知识强化之集合框架笔记31:集合之泛型类的概述和基本使用
- Java基础知识强化之集合框架笔记73:如何选择使用哪种集合
- Java基础知识强化之集合框架笔记10:Collection集合使用的步骤
- Java基础之集合框架——使用集合Vector<>挑选演员(TryVector)
- Java基础之集合框架(三)--Map、HashMap、TreeMap
- Java基础知识强化之集合框架笔记55:Map集合之HashMap集合(HashMap<Integer,String>)的案例
- Java基础知识强化之集合框架笔记56:Map集合之HashMap集合(HashMap<String,Student>)的案例