每个人的手机都有通讯录,在通讯录我们可以进行一系列的增加联系人的操作,并且联系人还能够按照A,B,C,D的顺序依次排好,你有没有好奇过它是如何实现的呢?今天我们就带领大家一起完成一个关于手机联系人的项目。
本节内容
1.结构分析
2.联系人功能的具体实现
一、结构分析
1.我们需要创建两个类,一个是Peoson类来封装每一个联系人,其中包含联系人的一些基本信息。还有一个就是Contact类,实现联系人排序还有其他操作的列表。
2.Person类:首先需要一个属性来记录每个名字首字母的拼音,还有一个属性来记录每个人的名字,然后有一个必备的构造方法,以及compareTo方法来排序。
3.Contact类:首先有一个方法展示联系人列表,还有一个添加联系人的方法,还有一个属性来保存有多少个栏目(也就是A,B,C,D啥的),还有一个Map类的数组,其中Key为各种栏目(A,B,C等),vaule为该栏目所对应的联系人
4.每次添加联系人时,都要先判断其首字母所代表的字母栏目是否已经存在,如果没有就需要重新创建一个栏目,如果有的话,那么就要对列表中的联系人重新排序。
二、联系人功能的具体实现
1.首先我们需要一个能够自动识别中文首字母的一个JRE包,将其添加到我们的Package里面,这个JRE包自己去网上寻找即可,直接Ctrl+V粘贴进去即可
2.首先创建一个Person类,在里面添加两个属性,一个是名字,还有一个是汉字首字母组成的字符串,并调用相应的构造方法
public class Person {
String firstAlpfaString ;//汉字的首字母组成的字符串
String name;
public Person(String firstAlpfaString, String name) {
this.firstAlpfaString = firstAlpfaString;
this.name = name;
}
}
3.然后创建一个Contact类,在里面添加两个属性,一个是字符串数组,用来保存每个栏目的标题,然后是一个Map类的数组,用来保存每个栏目对应的名字和内容,并提供相应的无参构造方法,在里面对titles和contacts初始化,Map只能创建HashMap类的对象。先写好两个函数的框架,一个是添加联系人的函数,还有一个是展示列表的函数
public class Contact {
ArrayList<String> titles; //保存每个栏目的标题
Map<String,Person> contacts;//保存每个栏目对应的名字和内容
public void showList(){
}
public void addPerson(){
}
public Contact( ){
titles=new ArrayList<>();
contacts=new HashMap<>();
}
}
4.创建一个Util类,首先我们需要一个可变的字符串变量来保存所有字符的首字母,然后将字符串转换为字符数组,接着设置大小写。然后开始遍历数组,首先判断是不是汉字,如果是的话就将汉字转化为拼音。如果不是汉字的话,那就不需要转化,直接将其拼接给可变字符串变量即可
public class Util {
public static String getFirstAlpha(String string) throws BadHanyuPinyinOutputFormatCombination {
//保存所有字符的首字母
StringBuilder sb=new StringBuilder();
//将字符串转换为字符数组
char[] chars= string.toCharArray();
HanyuPinyinOutputFormat format =new HanyuPinyinOutputFormat();
//设置大小写
format.setCaseType(HanyuPinyinCaseType.UPPERCASE);
format.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
//遍历数组
for(char ch:chars){
//判断是不是汉字
if(ch>128) {
//将汉字转换为拼音
try {
//返回的数组里面只有一个元素
String [] strings= PinyinHelper.toHanyuPinyinStringArray(ch, format);
//获取这个汉字拼音的首字母
sb.append(strings[0].charAt(0));
} catch (BadHanyuPinyinOutputFormatCombination e) {
e.printStackTrace();
}
}else {
//不是汉字,不需要转化
sb.append(ch);
}
}
return sb.toString();
}
}
5.创建一个主类,首先创建联系人对象,然后提供一个Scanner方法。然后进入循环,首先提示输入联系人姓名,接收之后,再将汉字姓名转换为拼音。然后创建一个Person类的对象
public class MyClass {
public static void main(String[] args) throws BadHanyuPinyinOutputFormatCombination {
//创建联系人对象
Contact contact =new Contact();
Scanner scanner=new Scanner(System.in);
while (true){
//提示添加联系人
System.out.print("请输入联系人姓名:");
String name=scanner.next();
//将汉字姓名转化为拼音(每个汉字的首字母大写)
String firstAlpha=Util.getFirstAlpha(name);
//创建person
Person person =new Person(firstAlpha,name);
//添加联系人
contact.addPerson(person);
//是否继续
if(!Util.IsContinue()){
break;
}
}
//显示列表
contact.showList();
}
}
6.在创建了一个Person类的对象之后,我们要进行一个操作,就判断这个人是否继续,那么我们就在Util类里面写一个方法(是否继续之后的操作)
//是否继续
public static boolean IsContinue(){
Scanner scanner =new Scanner(System.in);
while (true){
System.out.println("是否继续(1.继续 2.完成)?:");
int result= scanner.nextInt();
if(result==1) {
return true;
}else if(result==0){
return false;
}else{
System.out.println("输入格式不对");
}
}
}
7.我们先实现Contact类里面的showList方法,这个方法的作用就是显示所有联系人的信息,
//显示所有联系人信息
public void showList(){
for(String title:titles){
//打印这个栏目的标题:W
System.out.println(title);
//输出这个栏目对应的所有人信息
//获取这个title对应的联系人列表
List<Person> lists=contacts.get(title);
for(Person p:lists){
System.out.println(p.name);
}
}
}
8.接着我们实现Contact类里面的addPerson方法,在实现这个方法的过程中我们需要调用collections.sort方法对List进行排序。调用这个方法需要我们List里的对象的类型Person继承于一个comparable 接口,然后在Person类里面实现compareTo方法
@Override
public int compareTo(Person person) {
return firstAlpfaString.compareTo(person.firstAlpfaString);
}
然后就实现addPerson方法
//获取对应的首字母
String title= person.firstAlpfaString.substring(0,1);
//判断当前栏目中是否有这个person对应的首字母
if(titles.contains(title)){
//已经有这个栏目
//获取栏目对应的列表
List<Person> lists =contacts.get(title);
//添加到数组中
lists.add(person);
//对数组进行排序
Collections.sort(lists);
}else{
//没有这个栏目
//在标题数组中添加这个栏目
titles.add(title);
//对标题数组进行排序
Collections.sort(titles);
//添加键值对
List<Person> lists =new ArrayList<>();
lists.add(person);
contacts.put(title, lists);
}
}
欧克儿,以上就是我们今天的全部内容了,good拜。
网友评论