当前位置: 首页 > news >正文

个人通讯录(二)

个人通讯录(二)

需求:

通讯录(phone)用来保存若干个联系人的信息,且可以按照联系人姓名的拼音升序排序。要求通讯录提供一下功能:

1.添加联系人信息

2.删除指定联系人信息

3.修改指定联系人信息

4.查找联系人信息

6.清空联系人信息

一、重构类Contract

1.添加方法实现按照联系人姓名进行比较

Collartor类用来执行区分语言环境的字符串比较。通过Collator类提供静态方法getInstance()即可获得“中国”语言环境对应的Collator对象。

public int compareTo(Contract o) {Collator instance = Collator.getInstance(Locale.CHINA);return instance.compare(this.getName(),o.getName());
}
2.合并统一联系人的不同信息

对同一联系人的电话号码进行合并是需要进行去重处理。

//    2.合并统一联系人的不同信息public void mergeContract(Contract o) {if (this.getName().equals(o.getName())) {if (this.getGender().equals("") )this.setGender(o.getGender());if (this.getEmail().equals(""))this.setEmail(o.getEmail());//复制并去重boolean flag;String[] newPhones = new String[o.phones.length];int count = 0;for (int i = 0; i < o.getPhones().length; i++) {flag = true;for (int j = 0; j < o.getPhones()[i].length(); j++) {if (o.getPhones()[i].equals(this.getPhones()[j])) {flag = false;break;}}if (flag)newPhones[count++] = o.getPhones()[i];}int position = phones.length;phones = Arrays.copyOf(phones,phones.length+ count);//数组扩容System.arraycopy(newPhones,0,phones,position,count);//追加元素}}
3.定义方法实现联系人信息修改
//    3.定义方法实现联系人信息修改public boolean update(Contract c) {if (getName().equals(c.getName())) {if (c.getEmail() != null && c.getEmail() != "")setEmail(c.getEmail());if (c.getGender() != null && c.getGender() != "")setGender(c.getGender());if (c.getPhones() != null && c.getPhones().length != "")setPhones(c.getPhones());return true;}else return false;}

二、重构类Family

重载类父类的update方法,实现Family实例对象的修改

@Override
public boolean update(Contract c) {if (getName().equals(c.getName())){if (c instanceof Family) {super.update(c);Family f = (Family) c; //向上转型if (f.getBirthday() != null)setBirthday(((Family) c).getBirthday());if (f.getAdress() != null)setAdress(((Family) c).getAdress());return true;}else if (c instanceof Partner)return false;else {super.update(c);return true;}} elsereturn false;
}

三、重构类Partner

重载类父类的update方法,实现Family实例对象的修改

@Override
public boolean update(Contract c) {if (getName().equals(c.getName())) {if (c instanceof Family) {return false;} else if (c instanceof Partner) {super.update(c);Partner p = (Partner) c;if (p.getTitle() != null && p.getTitle() != "")setTitle(p.getTitle());if (p.getCompany() != null)getCompany().update(p.getCompany());return true;}else {super.update(c);return true;}}else {return false;}
}

####四、重构类Company

定义方法update(Company c)方法,实现对公司信息的修改

//    定义方法update(Company c)方法,实现对公司信息的修改public boolean update(Company c) {if(c == null)return false;if(c.getName() != null && c.getName() != "")setName(c.getName());if (c.getAdress() != null && c.getAdress() != "")setAdress(c.getAdress());if (c.getPhone() != null && c.getPhone() != "")setPhone(c.getPhone());if (c.getFax() != null && c.getFax() != "")setFax(c.getFax());return true;}

五、定义通讯录 PhoneBook类

通讯录 PhoneBook中保存了若干联系人信息,需要提供通讯录的增、删、查、改等操作

1.封装联系人信息

定义Contract数组

private Contract[] contracts;
2.定义setter方法

在setContract()方法中需要对联系人数组进行排序操作,以保证PhoneBook类按照联系人姓名的拼音升序排序

package address_book01;public class PhoneBook {
//    定义Contract数组private Contract[] contracts;
//    在setContract()方法中需要对联系人数组进行排序操作,以保证PhoneBook类按照联系人姓名的拼音升序排序public void setContracts(Contract[] contracts) {this.contracts = contracts;//对联系人进行排序for (int i = 0; i < contracts.length -1 ; i++) {Contract temp;for (int j = i + 1; j < contracts.length- 1; j++) {//冒泡排序if (contracts[i].compareTo(contracts[j]) > 0){temp = contracts[i];contracts[i] = contracts[j];contracts[j] = temp;}}}}
}
3.添加联系人

3种情况

空通讯录:分配数组空间,添加新的联系人

添加通讯录中不存在的联系人,对数组进行扩容,添加新的联系人

添加通讯录中存在的联系人,对同一人进行合并操作

public void add(Contract c) {if (contracts == null) { //空通讯录contracts = new Contract[1];Contract[0] = c;return;}int index = findContrat(c);if (index < 0) {Contract[] contractsAdded = Arrays.copyOf(contracts,contracts.length + 1);contractsAdded[contractsAdded.length -1] = c;setContracts(contractsAdded);return;}elsecontracts[index].mergeContract(c);//合并操作
}
4.删除联系人

查询联系人,通过移动数组实现元素的删除

//    查询联系人,通过移动数组实现元素的删除public boolean delete(Contract c){int index = findContrat(c);if (index < 0)return false;Contract[] contractsDeleted = new Contract[contracts.length-1];System.arraycopy(contracts,0,contractsDeleted,0,index);System.arraycopy(contracts,index+1,contractsDeleted,index,contracts.length-1-index);contracts = contractsDeleted;return true;}
5.根据姓名进行模糊查找

利用字符串的contains()方法对字符串进行模糊查询,获得满足条件的所有联系人。

//5.根据姓名进行模糊查找
//    利用字符串的contains()方法对字符串进行模糊查询,获得满足条件的所有联系人。public Contract[] findContractByName(String name) {Contract[] result = new Contract[contracts.length];int num = 0;for (int i = 0; i < contracts.length; i++) {if (contracts[i].getName().contains(name)){result[num++] = contracts[i];}}return Arrays.copyOf(result,num);}
}
6.修改联系人信息

首先查询待修改的联系人,人后利用多态修改联系人信息

 // 6.修改联系人信息
// 首先查询待修改的联系人,人后利用多态修改联系人信息public boolean updateContract(Contract c) {int index = findContrat(c);if (index < 0){return false;}contracts[index].update(c);return true;}
7.显示所有联系人

遍历联系人数组,利用多态技术调用display()方法,输出联系人或者子类对象的信息。

    public void display() {for (int i = 0; i < contracts.length; i++) {contracts[i].dispaly();}}
}
8.清空所有联系人
//8.清空所有联系人
public void clearContracts() {contracts = null;
}

相关文章:

个人通讯录(二)

个人通讯录&#xff08;二&#xff09; 需求&#xff1a; 通讯录&#xff08;phone&#xff09;用来保存若干个联系人的信息&#xff0c;且可以按照联系人姓名的拼音升序排序。要求通讯录提供一下功能&#xff1a; 1.添加联系人信息 2.删除指定联系人信息 3.修改指定联系人…...

DockerK8S常见面试知识

Docker docker的工作原理 docker是一个client-server结构的系统&#xff0c;docker守护进程运行在宿主机上&#xff0c;守护进程从客户端接受命令并管理运行在主机上的容器&#xff0c;容器是一个运行时环境&#xff0c;这就是我们说的集装箱 docker组成部分 1、docker cli…...

tcpdump arping nsenter

tcpdump 参数说明 tcpdump 是一款常用的网络抓包工具&#xff0c;它可以捕获网络数据包并进行分析。tcpdump 的参数非常多&#xff0c;下面是一些常用的参数说明&#xff1a; -i&#xff1a;指定要监听的网络接口&#xff0c;如 -i eth0。 any-n&#xff1a;禁用地址解析&…...

Python - 简单快速回忆基础语法

Python 是一种高级编程语言&#xff0c;易学易用 以下是 Python 基础语法的概述&#xff1a; 注释 Python 使用 # 符号来注释代码行。代码行 # 后的所有内容都将被认为是注释&#xff0c;不会被解释器执行&#xff0c;只是对代码的注释说明 # 这是一条注释 print("Hel…...

蓝牙耳机接打电话哪个比较好?接打电话最好的蓝牙耳机

技术已经发展到如此程度&#xff0c;耳机可以淹没嘈杂环境中不断出现的杂音&#xff0c;同时还能让我们在通话、音乐和娱乐方面保持清晰&#xff0c;既然如此&#xff0c;我们就来整理一下2023年适合通话和娱乐的无线耳机清单。 一、南卡小音舱Lite2蓝牙耳机 参考价格&#x…...

DeepSORT中的卡尔曼滤波

本文是看了DeepSORT方法视频之后&#xff0c;关于其中使用的卡尔曼滤波的理解 DeepSORT视频链接 首先贴几个比较好的&#xff0c;与本文由有关的几个帖子 图说卡尔曼滤波&#xff0c;一份通俗易懂的教程 卡尔曼滤波&#xff08;Kalman Filter&#xff09;原理与公式推导 卡尔…...

【Linux网络服务】SSH远程访问及控制

一、openssh服务器 1.1ssh协议 SSH&#xff08;Secure Shell&#xff09;是一种安全通道协议&#xff0c;主要用来实现字符界面的远程登录、远程 复制等功能&#xff1b; SSH 协议对通信双方的数据传输进行了加密处理&#xff0c;其中包括用户登录时输入的用户口令&#xff1…...

AutoGPT的出现,会让程序员失业吗?

最近&#xff0c;一个叫AutoGPT的模型火了&#xff0c;在GitHub上线数周Star数就直线飙升。截至目前&#xff0c;AutoGPT的Star数已经达到87k&#xff0c;马上接近90k&#xff0c;超过了PyTorch的65k。 根据AutoGPT的命名&#xff0c;就可以发现其神奇之处在于“auto”&#x…...

微信小程序php+vue 校园租房指南房屋租赁系统

本着诚信的原则&#xff0c;平台必须要掌握出租方必要的真实可信的信息&#xff0c;这样就可以防止欺诈事件的发生&#xff0c;事后也可以联系找到出租方。并且租金等各方面规范标准化&#xff0c;在这易租房诚信可信的平台让承租方与出租方充分有效对接&#xff0c;既方便了承…...

水果FL Studio21最新中文完整版下载更新及内容介绍

简单总结一下&#xff0c;本次小版本更新最重要的内容&#xff0c;我个人认为是对于M1芯片的适配。其余的比如EQ2&#xff0c;3x这些我们很熟悉的插件虽说也有更新&#xff0c;但是估计并没有特别大的改动。我个人的话会先放一段时间&#xff0c;等下次有其他更让我感兴趣的内容…...

springboot+vue小区物业管理系统(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的小区物业管理系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风…...

GEEer成长日记二十三:chatGPT可以帮我们提取水体边缘吗?

欢迎关注公众号&#xff1a;GEEer成长日记 目录 01 首先&#xff0c;chatGPT是什么&#xff1f; 02 进入正题&#xff0c;如何进行边缘检测&#xff1f; chatGPT推出之后&#xff0c;引发了激烈的讨论&#xff0c;今天带各位看看它在GEE方面能为我们做什么。原本想着它可以…...

程序员阿里三面无理由挂了,被HR一句话噎死,网友:这可是阿里啊

进入互联网大厂一般都是“过五关斩六将”&#xff0c;难度堪比西天取经&#xff0c;但当你真正面对这些大厂的面试时&#xff0c;有时候又会被其中的神操作弄的很是蒙圈。 近日&#xff0c;某位程序员发帖称&#xff0c;自己去阿里面试&#xff0c;三面都过了&#xff0c;却被…...

js面试题

在全局作用域下声明了一个变量 arr, 它的初始值是一个空数组 第二段代码&#xff0c;循环计数器变量i的初始值为0&#xff0c;循环条件是i的值小于2&#xff0c; 也就是说当i的值为0或者1时&#xff0c; 循环条件才能成立 才能够进入到循环体 当i的值为2时循环条件不成立&…...

SpringCloud --- Gateway服务网关

一、简介 Spring Cloud Gateway 是 Spring Cloud 的一个全新项目&#xff0c;该项目是基于 Spring 5.0&#xff0c;Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关&#xff0c;它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。 二、为…...

【java】CGLIB动态代理原理

文章目录 1. 简介2. 示例3. 原理4. JDK动态代理与CGLIB动态代理区别&#xff08;面试常问&#xff09; 1. 简介 CGLIB的全称是&#xff1a;Code Generation Library。 CGLIB是一个强大的、高性能、高质量的代码生成类库&#xff0c;它可以在运行期扩展Java类与实现Java接口&a…...

ArcGIS Pro、Python、USLE、INVEST模型等多技术融合的生态系统服务构建生态安全格局

第一章、生态安全评价理论及方法介绍 一、生态安全评价简介 ​ 二、生态服务能力简介 ​ 三、生态安全格局构建研究方法简介 ​ 第二章、平台基础一、ArcGIS Pro介绍1. ArcGIS Pro简介2. ArcGIS Pro基础3. ArcGIS Pro数据编辑4. ArcGIS Pro空间分析5. 模型构建器6. ArcGIS Pro…...

openstack安装应答文件时报错处理

环境&#xff1a;centos7 在执行packstack --answer-file./answer.ini命令后&#xff0c;一般需要几分钟才能完成&#xff0c;如何在applying IP controler.pp时报错&#xff0c;需要注意以下几点&#xff1a; 0.关闭firewalld和selinux&#xff08;必须&#xff09; system…...

SpringBoot整合MongoDB

文章目录 一、环境准备二、集合操作三、文档操作3.1 实体类3.2 添加文档3.3 查询文档3.4 修改文档3.5 删除文档 提示&#xff1a;以下是本篇文章正文内容&#xff0c;MongoDB 系列学习将会持续更新 一、环境准备 ①添加 SpringData 依赖&#xff1a; <dependency><…...

线程同步机制与互斥锁

线程同步机制 在多线程编程&#xff0c;一些敏感数据不允许被多个线程同时访问&#xff0c;此时就使用同步访问技术&#xff0c;保证数据在任何时刻&#xff0c;最多有一个线程访问&#xff0c;以保证数据的完整性。也可以这里理解:线程同步&#xff0c;即当有一个线程在对内存…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

HTML 语义化

目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案&#xff1a; 语义化标签&#xff1a; <header>&#xff1a;页头<nav>&#xff1a;导航<main>&#xff1a;主要内容<article>&#x…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全&#xff1a;零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言&#xff1a;云原生安全的范式革命 随着云原生技术的普及&#xff0c;安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测&#xff0c;到2025年&#xff0c;零信任架构将成为超…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...