**自己写的简单通讯录管理项目**
有集合基本的增删改查,我还没有学数据库什么的,就用对象序列化和反序列化来保存信息了。
本人菜鸟一枚,有不足之处请多指点。
package aatroxcarry.txl;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
public class Start {
public static void main(String[] args) throws Exception {
Crud crud = new Crud();
// 通讯录信息只会在正常退出时保存。
System.out.println(" 欢迎使用通讯录管理系统!");
while (true) {
crud.print();
String command = crud.input.next();
switch (command) {
case "1":
crud.one();
break;
case "2":
crud.two();
break;
case "3":
crud.three();
break;
case "4":
crud.four();
break;
case "5":
crud.five();
break;
case "6":
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(crud.file));
oos.writeObject(crud.txl);
oos.close();
System.out.println("通讯录的信息已保存在 " + crud.file + " 路径下。");
System.out.println("感谢您的使用,再见~");
System.exit(0);
default:
System.out.println("输入有误!");
break;
}
}
}
}
package aatroxcarry.txl;
import java.io.Serializable;
@SuppressWarnings("serial")
public class Person implements Serializable{
private String name;//姓名
private int age;//年龄
private String sex;//性别
private long telephone;//电话
private String address;//地址
public Person(String name, int age, String sex, long telephone, String address) {
this.name = name;
this.age = age;
this.sex = sex;
this.telephone = telephone;
this.address = address;
}
@Override
public String toString() {
return name + "\t" + age + "\t" + sex + "\t" + telephone + "\t" + address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public long getTelephone() {
return telephone;
}
public void setTelephone(long telephone) {
this.telephone = telephone;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
package aatroxcarry.txl;
import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.ObjectInputStream;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;
public class Crud {
Scanner input;
ArrayList<Person> txl;//英语不好,通讯录就用拼音表示了。
ObjectInputStream ois;
File file;
@SuppressWarnings("unchecked")
public Crud() throws Exception {
input = new Scanner(System.in);
//保存的路径,可以修改
file = new File("c:/txl.dat");
if(!file.exists()){
file.createNewFile();
}
try {
ois = new ObjectInputStream(new FileInputStream(file));
txl = (ArrayList<Person>) ois.readObject();
} catch (EOFException e) {
txl = new ArrayList<>();
}
}
public void print(){
System.out.println("**************************");
System.out.println("** 1 添加记录 **");
System.out.println("** 2 查找记录 **");
System.out.println("** 3 修改记录 **");
System.out.println("** 4 删除记录 **");
System.out.println("** 5 排序记录 **");
System.out.println("** 6 退出系统 **");
System.out.println("**************************");
System.out.println("输入要使用的功能:");
}
//查看通讯录中的对象
public void see(){
if(txl.size() == 0){
System.out.println("通讯录中无任何记录!");
return;
}
System.out.println("序号\t姓名\t年龄\t性别\t电话号码\t\t住址");
for(int i = 0; i < txl.size(); i++){
System.out.println(i+1 + "\t" + txl.get(i).toString());
}
}
/**
* 从键盘输入姓名、年龄、性别、电话、地址的方法。
* 由于后面有多处需要键盘输入这些属性,直接把这些输入写成方法,
* 简化代码,方便调用。
* @return 输入的姓名、年龄、性别、电话、地址
*/
public String inputName(){
System.out.println("输入姓名:");
String name = input.next();
return name;
}
public int inputAge(){
int age;
while(true){
System.out.println("输入年龄:");
String tempAge = input.next();
//利用正则判断
if(!tempAge.matches("[1-9]\\d?")){
System.out.println("请输入正确的年龄!(1~99之间)");
continue;
}
age = Integer.parseInt(tempAge);
break;
}
return age;
}
public String inputSex(){
String sex;
while (true) {
System.out.println("输入性别,(男 or 女)");
sex = input.next();
//利用正则判断,性别只能是男或女
if(!sex.matches("男|女")){
System.out.println("输入的性别不符合要求,请重新输入!");
continue;
}
break;
}
return sex;
}
public long inputTelephone(){
long telephone;
outer :
while(true){
System.out.println("输入电话号码:");
String tempTelephone = input.next();
//利用正则判断,规定号码必须是11位,以1开头。
if(!tempTelephone.matches("1\\d{10}")){
System.out.println("请输入正确的电话号码!(以1开头,共11位)");
continue;
}
telephone = Long.parseLong(tempTelephone);
//判断号码是否已经存在,若存在,则重新输入
for(int i = 0; i < txl.size(); i++){
if(txl.get(i).getTelephone() == telephone){
System.out.println("此号码已经存在,请重新输入!");
continue outer;
}
}
break;
}
return telephone;
}
public String inputAddress(){
String address;
while(true){
System.out.println("输入地址:");
address = input.next();
//利用正则判断,地址中应该不包含数字
if(!address.matches("[^0-9]+")){
System.out.println("地址输入有误!不能包含数字。");
continue;
}
break;
}
return address;
}
public void one() throws Exception{
while(true){
System.out.println("***************************");
System.out.println("** 1 添加新记录 **");
System.out.println("** 2 查看全记录 **");
System.out.println("** 3 返回上一级 **");
System.out.println("***************************");
String command = input.next();
switch(command){
case "1":
//调用输入姓名、年龄、性别、电话、地址的方法
txl.add(new Person(inputName(), inputAge(), inputSex(), inputTelephone(), inputAddress()));
System.out.println("添加记录成功!");
break;
case "2":
see();
break;
case "3":
return;
default :
System.out.println("输入有误!");
break;
}
}
}
/**
* 由于姓名、年龄、性别、住址的查找算法相同,就直接定义成一个方法
* @param type 根据type传的参数来判断查找的属性(姓名、年龄、性别、住址)
* @param obj 具体要查找的内容
*/
public void find(String type, Object obj){
//如果内容匹配则将其索引保存到list集合中。
ArrayList<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < txl.size(); i++) {
if("姓名".equals(type)){
if(txl.get(i).getName().equals(obj)){
list.add(i);
continue;
}
}else if("年龄".equals(type)){
if(txl.get(i).getAge() == (int)obj){
list.add(i);
continue;
}
}else if("性别".equals(type)){
if(txl.get(i).getSex().equals(obj)){
list.add(i);
continue;
}
}else if("住址".equals(type)){
if(txl.get(i).getAddress().equals(obj)){
list.add(i);
continue;
}
}
}
//遍历list,根据list中的内容来取得txl中的索引
if(list.size() != 0){
System.out.println("序号\t姓名\t年龄\t性别\t电话号码\t\t住址");
for(int i = 0; i < list.size(); i++){
System.out.println(list.get(i) + 1 + "\t" + txl.get(list.get(i)).toString());
}
}else{
System.out.println("没有找到此" + type + "的人!");
}
}
public void two(){
if(txl.isEmpty()){
System.out.println("通讯录中无任何记录!请先进行添加!");
return;
}
while(true){
System.out.println("***************************");
System.out.println("** 1 按姓名查找 **");
System.out.println("** 2 按年龄查找 **");
System.out.println("** 3 按性别查找 **");
System.out.println("** 4 按号码查找 **");
System.out.println("** 5 按住址查找 **");
System.out.println("** 6 查看全记录 **");
System.out.println("** 7 返回上一级 **");
System.out.println("***************************");
String command = input.next();
switch(command){
case "1":
String name = inputName();
find("姓名", name);
break;
case "2":
int age = inputAge();
find("年龄", age);
break;
case "3":
String sex = inputSex();
find("性别", sex);
break;
case "4":
//查找电话的标记。
boolean telephoneFlag = false;
long telephone;
while(true){
System.out.println("输入电话号码:");
String tempTelephone = input.next();
//利用正则判断,规定号码必须是11位,以1开头。
if(!tempTelephone.matches("1\\d{10}")){
System.out.println("请输入正确的电话号码!(以1开头,共11位)");
continue;
}
telephone = Long.parseLong(tempTelephone);
break;
}
//遍历查找
int i = 0;
for(; i < txl.size(); i++){
//如果找到,标记为true。
if(txl.get(i).getTelephone() == telephone){
telephoneFlag = true;
break;
}
}
//利用标记判断是否找到。
if(telephoneFlag){
System.out.println("序号\t姓名\t年龄\t性别\t电话号码\t\t住址");
System.out.println((i + 1) + "\t" + txl.get(i).toString());
}else{
System.out.println("没有找到此号码的人!");
}
break;
case "5":
String address = inputAddress();
find("住址", address);
break;
case "6":
see();
break;
case "7":
return;
default :
System.out.println("输入有误!");
break;
}
}
}
public void three() throws Exception{
if(txl.isEmpty()){
System.out.println("通讯录中无任何记录!请先进行添加!");
return;
}
while(true){
System.out.println("***************************");
System.out.println("** 1 查看全纪录 **");
System.out.println("** 2 修改指定目录 **");
System.out.println("** 3 返回上一级 **");
System.out.println("***************************");
String command = input.next();
switch(command){
case "1":
see();
break;
case "2":
int xuhao;
while(true){
System.out.println("输入修改的序号:");
String tempIndex = input.next();
if(!tempIndex.matches("\\d+")){
System.out.println("序号输入错误,请重新输入!");
continue;
}
xuhao = Integer.parseInt(tempIndex);
if (xuhao <= 0 || xuhao > txl.size()) {
System.out.println("序号越界!请重新输入!");
continue;
}
break;
}
System.out.println("***************************");
System.out.println("** 1 修改姓名 **");
System.out.println("** 2 修改年龄 **");
System.out.println("** 3 修改性别 **");
System.out.println("** 4 修改号码 **");
System.out.println("** 5 修改住址 **");
System.out.println("** 6 返回上一级 **");
System.out.println("***************************");
String xiugai = input.next();
switch(xiugai){
case "1":
String name = inputName();
txl.get(xuhao - 1).setName(name);
System.out.println("姓名修改成功!");
break;
case "2":
int age = inputAge();
txl.get(xuhao - 1).setAge(age);
System.out.println("年龄修改成功!");
break;
case "3":
String sex = inputSex();
txl.get(xuhao - 1).setSex(sex);
System.out.println("性别修改成功!");
break;
case "4":
long telephone = inputTelephone();
txl.get(xuhao - 1).setTelephone(telephone);
System.out.println("号码修改成功!");
break;
case "5":
String address = inputAddress();
txl.get(xuhao - 1).setAddress(address);
System.out.println("地址修改成功!");
break;
case "6":
break;
default :
System.out.println("输入有误!");
break;
}
break;
case "3":
return;
default :
System.out.println("输入有误!");
break;
}
}
}
public void four() throws Exception{
if(txl.isEmpty()){
System.out.println("通讯录中无任何记录!请先进行添加!");
return;
}
while(true){
System.out.println("***************************");
System.out.println("** 1 查看全纪录 **");
System.out.println("** 2 删除指定目录 **");
System.out.println("** 3 删除全部目录 **");
System.out.println("** 4 返回上一级 **");
System.out.println("***************************");
String command = input.next();
switch(command){
case "1":
see();
break;
case "2":
int xuhao;
System.out.println("请输入要删除的记录序号:");
while(true){
String tempIndex = input.next();
if(!tempIndex.matches("\\d+")){
System.out.println("序号输入错误,请重新输入!");
continue;
}
xuhao = Integer.parseInt(tempIndex);
if (xuhao <= 0 || xuhao > txl.size()) {
System.out.println("序号越界!请重新输入!");
continue;
}
break;
}
txl.remove(xuhao - 1);
System.out.println("删除成功!");
break;
case "3":
System.out.println("确定删除全部目录?");
System.out.println("确定 or 取消");
String remove = input.next();
switch(remove){
case "确定":
txl.clear();
System.out.println("通讯录已清空!");
break;
case "取消":
break;
default :
System.out.println("输入有误!");
break;
}
break;
case "4":
return;
default :
System.out.println("输入有误!");
break;
}
}
}
public void five() throws Exception{
if(txl.isEmpty()){
System.out.println("通讯录中无任何记录!请先进行添加!");
return;
}
while(true){
System.out.println("***************************");
System.out.println("** 1 按姓名排序 **");
System.out.println("** 2 按年龄排序 **");
System.out.println("** 3 按性别排序 **");
System.out.println("** 4 按号码排序 **");
System.out.println("** 6 查看全记录 **");
System.out.println("** 7 返回上一级 **");
System.out.println("***************************");
String command = input.next();
switch(command){
case "1":
System.out.println("未完成~");
break;
case "2":
Collections.sort(txl, ( p1, p2)->
p1.getAge() - p2.getAge()
);
System.out.println("按年龄排序完成!");
break;
case "3":
System.out.println("未完成~");
break;
case "4":
Collections.sort(txl, ( p1, p2)->{
if(p1.getTelephone() > p2.getTelephone()){
return 1;
}
if(p1.getTelephone() < p2.getTelephone()){
return -1;
}
return 0;
});
System.out.println("按号码排序完成!");
break;
case "6":
see();
break;
case "7":
return;
default :
System.out.println("输入有误!");
break;
}
}
}
}
热门评论
这个调试成功了吗,能直接用吗
从零开始都是自己写的???