【实验六】集合

1、完成第190页实验题目2(注意:在分组显示的时候,按名字进行排序时需要注入比较器,参考例8-8)

package shiyan6.shiyan62;



public class ContactPerson {//构造一个类

    private String name;   //姓名

    private String phoneNumber; //电话号码

    private String group; //分组



    public ContactPerson() {

    }

    public ContactPerson(String name, String phoneNumber, String group) {

        this.name = name;//参数name的值赋值给 本对象的成员变量this.name_string name。

        //当局部变量和成员变量重名的时候,在方法中使用this表示成员变量以示区分

        this.phoneNumber = phoneNumber;

        this.group = group;

    }

    public String getName() {//get 获取

        return name;//全都定义为private 私有成员,如果外部需要访问这些属性的话,是无法直接访问到的,需要调用get方法才能访问

    }

    public String getPhoneNumber() {

        return phoneNumber;

    }

    public String getGroup() {

        return group;

    }

    public boolean equals(Object obj){//比对相同类中的值是否相等

        if(obj==null) return false;//不同

        if(obj==this) return true;//自己本身

        //如果另一个对象和当前对象引用都一样,那么肯定是同一个对象实例//第一个地址是这个方法中参数传递过来对象的地址;另一个地址是调用这个方法的对象的地址

        if(obj instanceof ContactPerson){//左边是对象,右边是类;当对象是右边类所创建对象时,返回true;否则,返回false

            ContactPerson cp = (ContactPerson)obj;///将obj类型强制转换成contactPerson需要的类型

            return cp.name.equals(this.name) && cp.phoneNumber.equals(this.phoneNumber) && cp.group.equals(this.group);

        }

        return false;

    }

    public int hashCode(){

        return this.name.hashCode()^this.phoneNumber.hashCode()^this.group.hashCode()^0xabd926;//哈希码进行异或运算

    }

}

package shiyan6.shiyan62;



import java.util.Comparator;

 

public class ContactPersonComparator implements Comparator<Object>{//接口



    public int compare(Object obj1, Object obj2) {// obj1 和 obj2 是要使用 compare() 方法比较的两个对象

        //obj1>obj2  = 1  //1表示两个数位置交换,-1表示两个数位置不交换,0表示两个相同元素不排序

        ContactPerson cp1 = (ContactPerson)obj1;

        ContactPerson cp2 = (ContactPerson)obj2;

   

        return cp1.getName().compareTo(cp2.getName());

    }



}

 

package shiyan6.shiyan62 ;

import java.util.HashMap;//系统根据hash算法决定key的存储位置

import java.util.Iterator;// 用于迭代各种Collection(收集)集合

import java.util.Map;//,Map代表一种由多个key-value对组成的集合

import java.util.Scanner;

import java.util.Set;//Set代表一种集合元素无序、不可重复的集合。

import java.util.TreeSet;//TreeSet底层采用一个NavigableMap(可导航地图)来保存TreeSet集合的元素,NavigableMap是一个接口



public class MobileCommunication {

    private Set<ContactPerson> contacts;



    public MobileCommunication() {

        contacts = new TreeSet<ContactPerson>(new ContactPersonComparator());  //按姓名进行排序    

    }

   

    public void addContactPerson(){//添加姓名等信息

        Scanner scn = new Scanner(System.in);

       

        while(true){

            System.out.print("输入联系人姓名(quit表示退出):");

            String name = scn.next();

            if(name.equalsIgnoreCase("quit")){

                break;//跳出的条件

            }

           

            System.out.print("输入联系人电话号码:");

            String phoneNumber = scn.next();

           

            System.out.print("输入联系人分组:同事(colleagues),家人(family),朋友(friends):");

            String group = scn.next();

           

            contacts.add(new ContactPerson(name,phoneNumber,group));//结果返回的是几个String类对象拼接成的对象          

        }      

    }

   

    public void printMobileCommunication(){

        System.out.println("通讯录(按名字排序):");

       

        Iterator<ContactPerson> it = contacts.iterator();

        while(it.hasNext()){//调用 it.hasNext() 用于检测集合中是否还有元素

            ContactPerson cp = it.next();

            System.out.println(cp.getName()+"\t"+cp.getPhoneNumber()+"\t"+cp.getGroup());

        }      

    }

   

    public Map<String,Set<ContactPerson>> groupByGroup(){

        Set<ContactPerson> colleagues = new TreeSet<ContactPerson>(new ContactPersonComparator());

        Set<ContactPerson> family = new TreeSet<ContactPerson>(new ContactPersonComparator());

        Set<ContactPerson> friends = new TreeSet<ContactPerson>(new ContactPersonComparator());

        Map<String,Set<ContactPerson>> map= new HashMap<String,Set<ContactPerson>>();

       

        Iterator<ContactPerson> it = contacts.iterator();

        while(it.hasNext()){

            ContactPerson cp = it.next();

            if(cp.getGroup().equals("colleagues")){

                colleagues.add(cp);

            }else if(cp.getGroup().equals("family")){

                family.add(cp);

            }else if(cp.getGroup().equals("friends")){

                friends.add(cp);

            }

           

            map.put("colleagues",colleagues);

            map.put("family",family);

            map.put("friends", friends);            

        }  

        return map;

    }

   

    public void printGroup(Map<String,Set<ContactPerson>> map){

        Set<String> groups = map.keySet();

        Iterator<String> it = groups.iterator();

        while(it.hasNext()){

            String group = it.next();

            Set<ContactPerson> contacts = map.get(group);

            if(contacts.size()>0){

                System.out.println(group+"组内包含的联系人如下:");

                //输出组内信息

                Iterator<ContactPerson> itit = contacts.iterator();

                while(itit.hasNext()){

                    ContactPerson cp = itit.next();

                    System.out.println(cp.getName()+"\t"+cp.getPhoneNumber());

                }  

            }          

        }

    }

   

    public static void main(String[] args){

        MobileCommunication mc = new MobileCommunication();

        mc.addContactPerson();

        mc.printMobileCommunication();

       

        Map<String,Set<ContactPerson>> map = mc.groupByGroup();

        mc.printGroup(map);

    }

   

   



}

2、完成实验题目3

 

package shiyan6.shiyan63;



public class Course {

    private String name;   //课程名

    private int score; //学分



    public Course(String name) {

        this.name = name;//当局部变量和成员变量重名的时候,在方法中使用this表示成员变量以示区分。

        //参数name的值赋值给 本对象的成员变量

    }



//覆盖equals()方法

    public boolean equals(Object obj){

        Course c=(Course)obj;//将obj类型强制转换成course需要的类型

        if (this.name.equals(c.name) && this.score==c.score){

                return true;

        }else {

            return false;

        }

    }

       

    //覆盖hashCode()方法

    public int hashCode(){

        return name.hashCode()^score^0x12ab98c;

    }

   

//覆盖toString方法

    public String toString(){

        return (name);

    }

   

    public String getName() {

        return name;

    }



}




package shiyan6.shiyan63;



import java.util.ArrayList;

import java.util.Collections;

import java.util.HashMap;

import java.util.HashSet;

import java.util.Iterator;

import java.util.List;

import java.util.Map;

import java.util.Set;



public class SchoolClass {

    private String name; //学校名称

    private Set<Student> student;  //学校里的所有学生

   

    public SchoolClass(String name){

        this.name=name;

        student = new HashSet<Student>();

    }



    public void addStudent(Student s){   //向学校添加一个学生

        student.add(s);

    }

   

    public boolean removeStudent(String name){ //按姓名删除一个学生

        Iterator<Student> it = student.iterator();

        while(it.hasNext()){

            Student s = it.next(); //取出学生

            if (s.getName().equals(name)){ //找到该学生

                it.remove(); //使用迭代器删除该学生

                return true;

            }

        }

        return false;

    }

    public void show(){//显示所有的学生

        System.out.println(name); //输出学校名

//输出所有学生

        Iterator<Student> it = student.iterator();

        while(it.hasNext()){

            Student s = it.next();

            s.show();///显示学生的信息

        }

    }

   

//统计每门课程的选课人数

    //该方法返回一个Map,key代表课程,value代表人数

    public Map<Course, Integer> account(){

       

                //把所有的课程都放在list中待统计,同时将课程放在set中得知都有哪些课程

        List<Course> list = new ArrayList<Course>();

        Set<Course> set = new HashSet<Course>();

        Iterator<Student> it_stu = student.iterator();//学生的迭代器

        while(it_stu.hasNext()){

            Student s = it_stu.next(); //某学生

            Iterator<Course> it_course = s.getCourses().iterator(); //课程的迭代器

            while(it_course.hasNext()){

                Course c = it_course.next();

                list.add(c);   //将找到的课程加入list

                set.add(c);

            }

        }

       

        //依据set中的课程统计list它们各自出现了多少次

        Map<Course,Integer> map = new HashMap<Course,Integer>();

        Iterator<Course> it = set.iterator();

        while(it.hasNext()){

            Course c= it.next();

            int count = Collections.frequency(list, c);

            map.put(c, count);

        }      

        return map;

    }

   

}



package shiyan6.shiyan63;



import java.util.HashSet;

import java.util.Iterator;

import java.util.Set;



public class Student {

    private String name;

    private Set<Course> courses; //依据set中的课程统计list它们各自出现了多少次

   

    public Student(String name){

        this.name=name;

        courses=new HashSet<Course>();

    }

   

    public void addCourse(Course c){ //添加一个课程

        courses.add(c);

    }

    public boolean removeCourse(String name){//删除一门课程

        Iterator<Course> it = courses.iterator();

        while(it.hasNext()){

            Course c = it.next(); //去掉强转

            if (c.getName().equals(name)){ //找到该课程

                it.remove(); //使用迭代器删除该课程

                return true;

            }

        }

        return false;

    }

    public void show(){

        System.out.println(name+"选课:");   //输出学生姓名

    //输出该学生选的所有课程

        Iterator<Course> it = courses.iterator();

        while(it.hasNext()){

            System.out.println("\t"+it.next());

        }

    }



    public Set<Course> getCourses() {

        return courses;

    }



    public String getName() {

        return name;

    }



}



package shiyan6.shiyan63;

import java.util.Iterator;

import java.util.Map;

import java.util.Scanner;

import java.util.Set;

public class TestSchool {



    public static void main(String[] args) {

        SchoolClass school = new SchoolClass("Java学习...");

   

        Scanner scn = new Scanner(System.in);

       

    //添3个学生的选课信息

        for(int i=1; i<=3; i++){

            System.out.print("输入学生的姓名:");

            String name=scn.next();

            Student stu = new Student(name);

            while(true){

                System.out.print("输入课程,quit结束:");

                String course_name=scn.next();

                if(course_name.equalsIgnoreCase("quit")){

                    break;

                }

                Course c = new Course(course_name);

                stu.addCourse(c);

            }

            school.addStudent(stu);  //把学生加入

        }

       

    //显示所有学生的选课信息

        school.show();

       

    //统计选课信息

        Map<Course,Integer> map = school.account();

       

   

        //输出选课信息

        System.out.println("选课统计结果为:");

        Set<Course> set=map.keySet();//得到键值集合

        Iterator<Course> it = set.iterator();

        while(it.hasNext()){

            Course k =it.next();

            System.out.println(k.getName()+":\t"+map.get(k)+"人");  //取出键值中的value    

        }      

    }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hellenionia

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值