Java基础之集合框架——在文件中存储地图(TryPhoneBook2)
控制台程序。
import java.io.*;
public class Person implements Comparable<Person>, Serializable {
// Constructor
public Person(String firstName, String surname) {
this.firstName = firstName;
this.surname = surname;
}
// 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.exit(1);
}
return new Person(firstName,surname);
}
@Override
public boolean equals(Object person) {
return compareTo((Person)person) == 0;
}
@Override
public int hashCode() {
return 7*firstName.hashCode()+13*surname.hashCode();
}
@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;
}
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));
}
import java.io.*;
class PhoneNumber implements Serializable {
public PhoneNumber(String areacode, String number) {
this.areacode = areacode;
this.number = 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);
}
@Override
public String toString() {
return areacode + " " + number;
}
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 Comparable<BookEntry>, Serializable {
public int compareTo(BookEntry entry) {
return person.compareTo(entry.getPerson());
}
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.nio.file.*;
import java.io.*;
import java.util.*; class PhoneBook implements Serializable {
// List all entries in the book
public void listEntries() {
// Get the entries as a linked list
LinkedList<BookEntry> entries = new LinkedList<>(phonebook.values());
Collections.sort(entries); // Sort the entries for(BookEntry entry : entries) {
System.out.println(entry);
}
}
@SuppressWarnings("unchecked")
public PhoneBook() {
if(Files.exists(file)) { // If there's a phone book in a file...
try (ObjectInputStream in = new ObjectInputStream(new BufferedInputStream(Files.newInputStream(file)))){
phonebook = (HashMap<Person, BookEntry>)in.readObject(); //...read it in.
} catch(ClassNotFoundException| IOException e) {
e.printStackTrace();
System.exit(1);
}
}
} public void save() {
try {
Files.createDirectories(file.getParent()); // Make sure we have the directory
} catch (IOException e) {
System.err.println("I/O error creating directory. " + e.getMessage());
e.printStackTrace();
System.exit(1);
}
try (ObjectOutputStream out = new ObjectOutputStream(
new BufferedOutputStream(Files.newOutputStream(file)))){
System.out.println("Saving phone book");
out.writeObject(phonebook);
System.out.println("Done");
} catch(IOException e) {
System.out.println("I/O error saving phone book. " + e.getMessage());
e.printStackTrace();
System.exit(1);
}
} 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;
private Path file = Paths.get(System.getProperty("user.home")).resolve("Beginning Java Struff").resolve("Phonebook.bin");
}
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 TryPhoneBook2 {
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 3 to list all the entries\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 3:
book.listEntries();
break;
case 9:
book.save();
System.out.println("Ending program.");
return;
default:
System.out.println("Invalid selection, try again.");
break;
}
}
}
}
Java基础之集合框架——在文件中存储地图(TryPhoneBook2)的更多相关文章
- Java基础--说集合框架
版权所有,转载注明出处. 1,Java中,集合是什么?为什么会出现? 根据数学的定义,集合是一个元素或多个元素的构成,即集合一个装有元素的容器. Java中已经有数组这一装有元素的容器,为什么还要新建 ...
- 黑马程序员——【Java基础】——集合框架
---------- android培训.java培训.期待与您交流! ---------- 一.集合框架概述 (一)集合框架中集合类关系简化图 (二)为什么出现集合类? 面向对象语言对事物的体现都是 ...
- java基础37 集合框架工具类Collections和数组操作工具类Arrays
一.集合框架工具类:Collections 1.1.Collections类的特点 该工具类中所有的方法都是静态的 1.2.Collections类的常用方法 binarySearch(List< ...
- Thinking in java基础之集合框架(转载)
集合简介(容器)把具有相同性质的一类东西,汇聚成一个整体,就可以称为集合,例如这里有20个苹果,我们把每一个苹果当成一个东西(一个对象),然后我们借用袋子把这20个苹果装起来,而这个袋子就是集合(也叫 ...
- Java基础之集合框架(Collection接口和List接口)
首先我们说说集合有什么作用. 一.集合的作用 1.在类的内部,对数据进行组织: 2.简单而快速的搜索大数量的条目: 3.有的集合接口,提供一系列排列有序的元素,并且可以在序列中间快速的插入或者删除有关 ...
- java基础之集合框架
6.集合框架: (1)为什么出现集合类? 面向对象对事物的体现都是以对象的形式,为了方便对多个对象的操作,就对对象进行存储. 集合就是存储对象最常用的一种方式. (2)数组和集合都是容器,两者有何不同 ...
- Java基础之集合框架——使用集合Vector<>挑选演员(TryVector)
控制台程序. public class Person implements Comparable<Person> { // Constructor public Person(String ...
- Java导出List集合到txt文件中——(四)
有时候,需要将数据以一定格式导出到txt文件中.利用Java的IO可以轻松的导出数据到txt中. package Action.txt; import java.io.BufferedWriter; ...
- Java基础之集合框架——使用堆栈Stack<>对象模拟发牌(TryDeal)
控制台程序. public enum Rank { TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING, A ...
随机推荐
- userDefaults
// // RootViewController.m #import "RootViewController.h" @interface RootViewController () ...
- MongoVUE的使用
配置连接: Ok,连接成功齐活儿~ 下面来试一下,插入一个新的名为Message的Collection : 然后插入个Document
- Translation Lookaside Buffer
COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION In principle, then, e ...
- strcpy 和 strnpy 区别
与strncpy的区别 第一种情况: 1 2 3 4 char* p="how are you ?"; char name[20]="ABCDEF ...
- JAVA内省(Introspector)
什么是Java内省:内省是Java语言对Bean类属性.事件的一种缺省处理方法. Java内省的作用:一般在开发框架时,当需要操作一个JavaBean时,如果一直用反射来操作,显得很麻烦:所以sun公 ...
- 面向对象之struct
struct PointStruct { int pointx = 1; int pointy = 2; public PointStruct(int x, int y) { this.pointx ...
- Ubuntu 设置Vim tab为四个空格
使用root权限打开 /etc/vim/vimrc 添加下列配置 set tabstop= set softtabstop= set shiftwidth= set noexpandtab set n ...
- asp.net实现关闭当前网页
asp.net实现关闭当前网页功能:Response.Write("<script>window.close();</script>");// 会弹出询问是 ...
- css模仿表格 居中
<div class="service_box"><div class="service_list"> <span class=& ...
- mysql integer size 大小
I was always wondering what the size of numeric columns in MySQL was. Forgive me if this is obvious ...