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
}
}
}