java中集合的结构Map类型
Map接口 map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能给实现根据key快速查找value Map中的键值对以Entry类型的对象实例形式存在
Entry类型的对象实例 Key---value
键(key值)不可重复,value可以 每个键最多只能映射到一个值。
Map接口提供了分别返回key值集合,value值集合以及Entry(键值对)集合的方法
Map支持泛型,形式如:Map(K,V)
Hashmap类 hashmap是map的一个重要实现类,也是最常用的,基于哈希表实现
Hashmap中的Entry对象是无序排列的 key值和value值都可以为null,但是一个HashMap只能有一个key值为null的映射(key值不可重复)
在课程序列中,如何判断是否包含某门或者某几门课程?
如果课程学列包含某门课程,如何判断该课程的索引位置?
应用 Collections.sort() 实现 List 排序
Arrays类 java.util.Arrays 包含操作数组的各种静态方法
Collections工具类 java.util.Collections
Collections工具类 是Java集合框架中,用来操作集合对象的工具类 也是Java集合框架的成员 sort() (排序)方法
/**
* 课程类 Course
*/
public class Course
{
public String id;
public String name;
public Course(String id,String name){
this.id = id;
this.name = name;
}
//添加一个无参构造器
public Course() {
}
//重新equals函数,这个写了一部分不再写了
/*@Override
public boolean equals(Object obj) {
if(this == obj) {
return true;
}
if(obj == null)
return false;
return true;
}
*/
}
import java.util.Set;
import java.util.HashSet;
/**
* 学生类 Student
*/
//public class Student
public class Student implements Comparable<Student> {
public String id;
public String name;
//public Set courses;//课程信息的属性,以前这样的实例
public Set<Course>courses;//课程信息的属性
public Student(String id,String name){ //构造器
this.id = id;
this.name = name;
//this.courses = new HashSet();//以前这样写
this.courses = new HashSet<Course>();
}//Student end
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime*result + ((name == null)?0:name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if(this == obj)
return true;
if(obj == null)
return false;
if(!(obj instanceof Student))
return false;
Student other = (Student)obj;
if(name == null) {
if(other.name != null)
return false;
}else if(!name.equals(other.name))
return false;
return true;
}
@Override
public int compareTo(Student o) {
return this.id.compareTo(o.id);
}//compareTo end
}//Student end
MapTest测试类如下所示:
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.Map;
import java.util.HashMap;
import java.util.Set;
public class MapTest
{
/**
* 用来承接学生类型对象,其中key为学生ID,value为学生对象,通过键盘输入学生信息,对集合中的学生信息进行增,删,改,查操作
*/
public Map<String,Student> students;
/**
* 在构造器中初始化students属性
*/
public MapTest() {
this.students = new HashMap<String,Student>();
}
/**
* 测试添加:输入学生ID,判断是否被占用
* 若未被占用,则输入姓名,创建新学生对象,并且添加到students中
*/
public void testPut() {
//创建一个Scanner对象,用来获取输入的学生ID和姓名
Scanner console = new Scanner(System.in);//引入scanner类
int i=0;
while(i<3) {
System.out.println("请输入学生ID:");
String ID = console.next();
//判断该ID是否被占用
Student st = students.get(ID);
if(st == null) {
//提示输入学生姓名
System.out.println("请输入学生姓名:");
String name = console.next();
//创建新的学生对象
Student newStudent = new Student(ID,name);
//通过调用students的put方法,添加ID-学生映射 添加到map里面了,students是map对象名称
students.put(ID,newStudent);
System.out.println("成功添加学生:"+students.get(ID).name);
i++;
}else{//st end
System.out.println("请学生ID已被占用!");
continue;
}
}//while end
}//testput end
/**
* 测试Map的keySet方法
*/
public void testKeySet() {
//通过keySet方法,返回Map中的所有"键"的Set集合
Set<String> keySet = students.keySet();
//取得students的容量
System.out.println("总共有:"+students.size()+"个学生!");
//遍历keySet,取得每一个键,再调用get方法取得每个键对应的value
for(String stuId:keySet) {
Student st = students.get(stuId);
if(st!=null) {
System.out.println("学生:"+st.name);
}
}//for end
//st = students.get(stuId); 是获取的value值,因为value值里面有id和name,所以st.name就是name值。
}
/**
* 测试删除Map中的映射
*/
public void testRemove() {
//获取从键盘输入的待删除学生ID字符串
Scanner console = new Scanner(System.in);//引入scanner类
while(true) {
//提示输入待删除的学生的ID
System.out.println("请输入要删除的学生的ID!");
String ID = console.next();
//判断该ID是否有对应的学生对象
Student st = students.get(ID);
if(st==null) {
//提示输入的ID并不存在
System.out.println("该ID不存在");
continue;
}//if end
students.remove(ID);
System.out.println("成功删除学生:"+st.name);
break;
}//while end
}
/**
* 通过entrySet方法来遍历Map
*/
/*public void testEntrySet() {
//通过entrySet方法,返回Map中的所有键值对
Set<Entry<String,Student>> entrySet = students.entrySet();
//Set.Entry<String,Student> entrySet = students.entrySet();
for(Entry<String,Student> entry : entrySet) {
System.out.println("取得键:"+entry.getKey());
System.out.println("对应的值为:"+entry.getValue());
}//for end
}//testEntrySet end
*/
/**
* 利用put方法修改Map中的已有映射
*/
public void testModify() {
//提示输入要修改的学生ID
System.out.println("请输入要修改的学生ID:");
//创建一个scanner对象,去获取从键盘上输入的学生ID字符串
Scanner console = new Scanner(System.in);
while(true) {
//取得从键盘输入的学生ID
String stuID = console.next();
//从students中查找该学生ID对应的学生对象
Student student = students.get(stuID);
if(student == null) {
System.out.println("该ID不存在,请重新输入!");
continue;
}
//提示当前对应的学生对象的姓名
System.out.println("当前该学生id,所对应的学生为:"+student.name);
//提示输入新的学生姓名,来修改已有的映射
System.out.println("请输入新的学生姓名:");
String name=console.next();
Student newStudent = new Student(stuID,name);
students.put(stuID,newStudent);
System.out.println("修改成功");
break;
}//while end
}//testModify end
/**
* 测试map中,是否包含某个key值或者某个value值
* contains public boolean contains(Object o) 如果此列表中包含指定的元素,则返回true.
*/
public void testContainsKeyOrValue() {
//提示输入学生ID
System.out.println("请输入要查询的学生ID:");
//创建一个scanner对象,去获取从键盘上输入的学生ID字符串
Scanner console = new Scanner(System.in);
String id = console.next();
//在Map中,用containsKey()方法,来判断是否包含某个key值
System.out.println("你输入的学生ID为:"+id+",在学生映射表中是否存在:"+students.containsKey(id));
if(students.containsKey(id))
System.out.println("对应的学生为:"+students.get(id).name);
//提示输入学生姓名
System.out.println("请输入要查询的学生姓名:");
String name = console.next();
//在Map中,用containsValue()方法,来判断是否包含某个value值
if(students.containsValue(new Student(null,name)))
System.out.println("在学生映射表中,确实包含学生:"+name);
else
System.out.println("在学生映射表中不存在该学生");
}//testContainsKeyOrValue end
public static void main(String[] args) {
//System.out.println("nihaoya");
MapTest mt = new MapTest();
mt.testPut();
mt.testKeySet();
//mt.testRemove();
//mt.testEntrySet();
// mt.testModify();
//mt.testEntrySet();
mt.testContainsKeyOrValue();
}//main end
}