美文网首页
Java实战开发(3)——手机联系人项目

Java实战开发(3)——手机联系人项目

作者: 让时间走12138 | 来源:发表于2020-04-09 22:05 被阅读0次
每个人的手机都有通讯录,在通讯录我们可以进行一系列的增加联系人的操作,并且联系人还能够按照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拜。

相关文章

网友评论

      本文标题:Java实战开发(3)——手机联系人项目

      本文链接:https://www.haomeiwen.com/subject/cvmnphtx.html