作者:獅子也瘋狂
專欄:《項目集錦》
堅持做好每一步,幸運之神自然會駕凌在你的身上
一. ?? 項目描述
該項目是用于日常生活中記錄聯(lián)系人信息的一款智能小工具。實現(xiàn)了對聯(lián)系人的姓名、年齡、性別、電話號碼、住址的添加及修改、查找、刪除、排序等功能。該項目是以 Windows 控制臺為運行平臺,所有的操作都應(yīng)在控制臺上進行。
二. ??編寫目的
通過該項目將平時所學(xué)的內(nèi)容綜合到一起并運用到實際的項目中。并且通過實現(xiàn)自己實現(xiàn)的數(shù)據(jù)結(jié)構(gòu)來實現(xiàn)存儲和持久化處理(老師不給用集合,自己實現(xiàn)一個數(shù)據(jù)結(jié)構(gòu)來存儲)
該項目能夠充分的體現(xiàn)出一些簡單的業(yè)務(wù)流程處理,能夠使同學(xué)們掌握基本的業(yè)務(wù)流程處理。進一步理解什么是面相對象設(shè)計(OOD:Object Oriented Design)
。充分理解面向?qū)ο笤O(shè)計的精髓。總的來說,就是要完成作業(yè)。
三. ??技術(shù)說明
3.1 業(yè)務(wù)流程結(jié)構(gòu)圖
3.2 數(shù)據(jù)存儲結(jié)構(gòu)
id | 序號 |
---|---|
name | 姓名 |
age | 年齡 |
sex | 性別 |
telNum | 電話號碼 |
address | 地址 |
3.3 技術(shù)要求及開發(fā)環(huán)境
- JDK 版本為 11
- 鍵盤輸入 Scanner 類
- 正則表達式 Pattern 類
- 自編寫數(shù)據(jù)結(jié)構(gòu)LinkedList
- Windows 10 & idea 2020
四. ??項目開發(fā)
4.1 創(chuàng)建菜單類
進入每個功能模塊,用戶都有清晰的功能選擇。還有返回上一層,降低了代碼的耦合性。
public class Menus {
//主界面
public void mainMenu(){
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 退出系統(tǒng) **");
System.out.println("--------------?------------");
}
//添加界面
public void addMenu(){
System.out.println("--------------?------------");
System.out.println("** 1 添加新記錄 **");
System.out.println("** 2 查看全記錄 **");
System.out.println("** 3 返回上一級 **");
System.out.println("--------------?------------");
}
//查找界面
public void searchMenu(){
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("--------------?------------");
}
//修改界面
public void modifyMenu(){
System.out.println("---------------?------------");
System.out.println("** 1 查看全記錄 **");
System.out.println("** 2 修改指定記 **");
System.out.println("** 3 返回上一級 **");
System.out.println("--------------?------------");
}
//修改子界面
public void subModifyMenu(){
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("--------------?------------");
}
//刪除界面
public void deleteMenu(){
System.out.println("--------------?------------");
System.out.println("** 1 查看全部記錄 **");
System.out.println("** 2 刪除指定記錄 **");
System.out.println("** 3 刪除全部記錄 **");
System.out.println("** 4 返回上一級 **");
System.out.println("--------------?------------");
}
//排序界面
public void orderMenu(){
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("--------------?------------");
}
}
4.2 創(chuàng)建實體類
import java.io.Serializable;
public class Users implements Serializable {
private int id;
private String name;
private int age;
private String sex;
private String telNum;
private String address;
public Users() {
}
public Users(String name, int age, String sex, String telNum, String address) {
this.name = name;
this.age = age;
this.sex = sex;
this.telNum = telNum;
this.address = address;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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 String getTelNum() {
return telNum;
}
public void setTelNum(String telNum) {
this.telNum = telNum;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "id=" + id +
"\tname: " + name +
" age: " + age +
" sex: " + sex +
" telNum: " + telNum +
" address: " + address +"\t\t";
}
}
4.3 創(chuàng)建數(shù)據(jù)校驗類
數(shù)據(jù)校驗類是為了避免在使用過程,用戶輸入錯誤的數(shù)據(jù)又跳轉(zhuǎn)了,導(dǎo)致系統(tǒng)出錯。
import java.util.Scanner;
public class Varify {
Scanner S = new Scanner(System.in);
/**
* 校驗主菜單
* @param min
* @param max
* @return int
*/
public int menuVarify(int min,int max){ //菜單選項驗證
String str1 = "\\d";
while(true){
System.out.println("最小為"+min+","+"最大為"+max+";"+"請輸入您的選擇:");
String input = S.nextLine();
if(input.matches(str1)){
int num = Integer.parseInt(input);
if(num >=min&&num<=max){
return num;
}else{
System.out.println("請輸入有效數(shù)字!??!");
}
}else{
System.out.println("您的輸入有誤,請重新輸入?。?!");
}
}
}
/**
* 校驗名字
* 漢字或者字母
* @return name
*/
public String nameVarity(){
String str = "[A-Za-z\\u4e00-\\u9fa5]{1,10}";
while (true){
System.out.println("請輸入您的名字(中文/英文):");
String name = S.nextLine();
if(name.matches(str)){
return name;
}else{
System.out.println("您的輸入有誤,請重新輸入!");
}
}
}
/**
*
* @return
*/
public int ageVarity(){
String str = "\\d{0,125}";
while(true){
System.out.println("請輸入您的年齡:(0-125)");
String age = S.nextLine();
if(age.matches(str)){
return Integer.parseInt(age);
}else{
System.out.println("輸入有誤,請重新輸入!");
}
}
}
public String sexVarity(){
String str = "[男|女]{1}";
while(true){
System.out.println("請輸入您的性別:(男/女)");
String sex = S.nextLine();
if(sex.matches(str)){
return sex;
}else{
System.out.println("輸入有誤,請重新輸入!");
}
}
}
public String tellNumVarity(){
String str = "(\\d{3,4}-\\d{7,8})|([1]{1}\\d{10})";
while(true){
System.out.println("請輸入電話號碼或者座機號碼:");
String inputNum = S.nextLine();
if(inputNum .matches(str)){
return inputNum;
}else{
System.out.println("您輸入的電話號碼有誤,請重新輸入:");
}
}
}
public String addressVarity(){
String str = "[a-zA-Z\\u4e00-\\u9fa5]{1,50}";
while(true){
System.out.println("請輸入地址:字母或者漢字");
String inputName = S.nextLine();
if(inputName.matches(str)){
return inputName;
}else{
System.out.println("您輸入的地址有誤,請重新輸入:");
}
}
}
}
4.4 創(chuàng)建雙向鏈表
這個是模仿LinkedList的雙向鏈表,里面有基本添加,刪除,清空鏈表功能。
import java.io.Serializable;
public class DoubleLinkedList<E> implements ListInterface<E>, Serializable {
private Node<E> headNode; //記錄頭結(jié)點
private Node<E> tailNode; //記錄尾結(jié)點
private int size; //記錄結(jié)點數(shù)
public int getSize() {
return size;
}
/**
* 定義結(jié)點類
* @param <E>
*/
class Node<E> implements Serializable{
Node prevNode; //前
E element; //記錄元素
Node next; //后
public Node(Node prevNode, E element, Node next) {
this.prevNode = prevNode;
this.element = element;
this.next = next;
}
public Node(E element) {
this.element = element;
}
}
private void addNode(E element){
Node t = this.tailNode;
Node node = new Node(t,element,null);
this.tailNode = node;
if(t == null){
this.headNode = node;
}else{
t.next = node;
}
this.size++;
}
/**
* 添加元素
* @param element
*/
@Override
public void add(E element) {
this.addNode(element);
}
private Node getNode(int index){
if(index <= (this.size>>1)){
Node node = this.headNode;
for(int i = 0;i<index;i++){
node = node.next;
}
return node;
}
else{
Node node = this.tailNode;
for(int i = this.size-1;i>index;i--){
node = node.prevNode;
}
return node;
}
}
/**
* 在指定位置添加元素
* @param index
* @param element
*/
@Override
public void add(int index,E element){
if(index < 0||index >=this.size){
throw new IndexOutOfBoundsException("下標不合法:"+index);
}
Node<E> node = new Node(element);
if(index == 0){
node.next = this.headNode;
this.headNode.prevNode = node;
this.headNode = node;
}else if(index+1 == this.size){
this.tailNode.next = node;
node.prevNode = tailNode;
this.tailNode = node;
}else{
Node<E> temp = this.getNode(index-1);
node.next = temp.next;
temp.prevNode = node;
temp.next = node;
node.prevNode = temp;
}
this.size++;
}
/**
* 根據(jù)下標添加元素
* @param index
* @return
*/
@Override
public E get(int index) {
if(index < 0||index >=this.size){
throw new IndexOutOfBoundsException("下標不合法:"+index);
}
Node<E> node = this.getNode(index);
return node.element;
}
@Override //刪除元素
public boolean remove(int index) {
if(index <0||index >=this.size){
throw new IndexOutOfBoundsException("下標不合法:"+index);
}
Node<E> node = this.getNode(index);
if(node.prevNode == null){
this.headNode = node.next;
}else{
node.prevNode.next = node.next;
}
if(node.next == null){
this.tailNode = node.prevNode;
} else{
node.next.prevNode = node.prevNode;
}
node.prevNode = null;
this.size--;
return true;
}
@Override //清空所有元素
public boolean removeAll(){
this.headNode = null;
this.tailNode = null;
this.size = 0;
return true;
}
}
4.5 創(chuàng)建持久層文件處理
創(chuàng)建一個IoUtil包,封裝好了讀取文件方法,和將數(shù)據(jù)寫入文件的方法,專門進行文件的讀取和寫入,簡化了在使用過程中,創(chuàng)建輸入輸出流的繁瑣步驟,加快了生產(chǎn)效率。
import java.io.*;
/**
* 文件讀取
*/
public class IoUtil {
/**
* 讀取文件
* @param fileName
* @return
* @throws IOException
*/
public static Object readFile(String fileName) throws IOException, ClassNotFoundException {
FileInputStream fileInputStream = new FileInputStream(fileName);
ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
return objectInputStream.readObject();
}
public static void writeFile(Object obj,String fileName) throws IOException {
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(fileName));
objectOutputStream.writeObject(obj);
}
}
4.6 創(chuàng)建正則表達式
tips
:
正則表達式是對字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規(guī)則字符串”,這個“規(guī)則字符串”用來表達對字符串的一種過濾邏輯。使用特殊語法來表示字符類、數(shù)量限定符和位置關(guān)系,然后用這些特殊語法和普通字符一起表示一個模式。
這里的校驗類有很多種,分別有主菜單的校驗,名字的校驗,年齡輸入的校驗,電話號碼是否輸入正確的校驗,還有地址的校驗。實現(xiàn)詳情請看以下代碼:
import java.util.Scanner;
public class Varify {
Scanner S = new Scanner(System.in);
/**
* 校驗主菜單
* @param min
* @param max
* @return int
*/
public int menuVarify(int min,int max){ //菜單選項驗證
String str1 = "\\d";
while(true){
System.out.println("最小為"+min+","+"最大為"+max+";"+"請輸入您的選擇:");
String input = S.nextLine();
if(input.matches(str1)){
int num = Integer.parseInt(input);
if(num >=min&&num<=max){
return num;
}else{
System.out.println("請輸入有效數(shù)字?。。?);
}
}else{
System.out.println("您的輸入有誤,請重新輸入!??!");
}
}
}
/**
* 校驗名字
* 漢字或者字母
* @return name
*/
public String nameVarity(){
String str = "[A-Za-z\\u4e00-\\u9fa5]{1,10}";
while (true){
System.out.println("請輸入您的名字(中文/英文):");
String name = S.nextLine();
if(name.matches(str)){
return name;
}else{
System.out.println("您的輸入有誤,請重新輸入!");
}
}
}
/**
*
* @return
*/
public int ageVarity(){
String str = "\\d{0,125}";
while(true){
System.out.println("請輸入您的年齡:(0-125)");
String age = S.nextLine();
if(age.matches(str)){
return Integer.parseInt(age);
}else{
System.out.println("輸入有誤,請重新輸入!");
}
}
}
public String sexVarity(){
String str = "[男|女]{1}";
while(true){
System.out.println("請輸入您的性別:(男/女)");
String sex = S.nextLine();
if(sex.matches(str)){
return sex;
}else{
System.out.println("輸入有誤,請重新輸入!");
}
}
}
public String tellNumVarity(){
String str = "(\\d{3,4}-\\d{7,8})|([1]{1}\\d{10})";
while(true){
System.out.println("請輸入電話號碼或者座機號碼:");
String inputNum = S.nextLine();
if(inputNum .matches(str)){
return inputNum;
}else{
System.out.println("您輸入的電話號碼有誤,請重新輸入:");
}
}
}
public String addressVarity(){
String str = "[a-zA-Z\\u4e00-\\u9fa5]{1,50}";
while(true){
System.out.println("請輸入地址:字母或者漢字");
String inputName = S.nextLine();
if(inputName.matches(str)){
return inputName;
}else{
System.out.println("您輸入的地址有誤,請重新輸入:");
}
}
}
}
4.7 創(chuàng)建用戶業(yè)務(wù)層
功能太多,但是較為簡單,就不一一闡述。文章來源:http://www.zghlxwxcb.cn/news/detail-742706.html
五. ??總結(jié)
一個跟數(shù)據(jù)結(jié)構(gòu)掛鉤的期末實驗,功能實現(xiàn)并不復(fù)雜,接近crud,但是構(gòu)造整體框架很復(fù)雜,花費了很多精力去打磨。唯一一個難點就是雙向鏈表的編寫;還有就是正則表達式的使用不夠熟練,查詢了很多資料,才知道如何去使用。給大家介紹了一個很簡單的Java小項目入門,希望大家喜歡。
項目已經(jīng)開源到git,感興趣的小伙伴點擊:下載文章來源地址http://www.zghlxwxcb.cn/news/detail-742706.html
到了這里,關(guān)于通訊錄管理系統(tǒng)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!