Map


package onlinejudge;
import java.util.*;
import java.util.Map.Entry;  
/*
 * Map提供一种映射关系,其中的元素是以键值对的形式存储,能够实现根据key快速查找value
 * Map中的键值对是以Entry类型的对象实例形式存在
 * 键(key)不可重复,value可以重复
 * 每个键最多可以映射到一个value值
 * 支持泛型
 */

/*
 * HashMap基于哈希表
 * Hash Map中的Entry对象是无序排列的
 * key值和value值都可以是null,但是一个HashMap只能有一个key值为null的映射
 */
class Student{  
    String id;  
    String name; 
    /*
     * (non-Javadoc)
     * @see java.lang.Object#hashCode()
     */
    @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;
	}
	Set courses;// Set is interface  
    Student(String id, String name){  
        this.id = id;  
        this.name = name;  
        this.courses = new HashSet();  
        //HashSet is Set's class  
    }  
}
class MapTest{
	Map<String ,Student> students;
	MapTest(){
		this.students = new HashMap<String , Student>();
	}
	void testPut() {
		Scanner cin = new Scanner(System.in);
		int i  = 0;
		while(i<3) {
			System.out.println("请输入学生Id");
			String ID = cin.next();
			//判断ID是否被占用
			Student st = students.get(ID);
			if(st==null) {
				//提示输入学生姓名
				System.out.println("请输入学生姓名");
				String name = cin.next();
				//创建新的学生对象
				Student newStudent = new Student(ID,name);
				//通过调用students的put方法,添加ID-学生映射
				students.put(ID,newStudent);
				System.out.println("成功添加学生:" + students.get(ID).name);
				i++;
			}
			else {
				System.out.println("该学生ID已被占用");
				continue;
			}
		}
	}
	void testKeySet() {//测试Map的KeySet方法
		//通过keyset方法,返回Map中的所有键的Set集合
		Set<String> keySet = students.keySet();
		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);
		}
	}
	void testRemove() {
		//提示用户待删除学生ID
		System.out.println("请输入要删除的学生ID");
		Scanner cin = new Scanner(System.in);
		while(true) {
		//提示用户待删除学生ID
		System.out.println("请输入要删除的学生ID");
		String ID = cin.next();
		//判断ID是否有对应的学生对象
		Student st = students.get(ID);
		if(st==null) {
			System.out.println("输入ID不存在");
			continue;
		}
		students.remove(ID);
		System.out.println("成功删除学生:" + st.name);
		break;
	  }
	}
	void testEntrySet() {//通过entrySet遍历Map,返回所有的键值对的集合
		Set<Entry<String,Student>>entrySet = students.entrySet();
		for(Entry<String,Student>entry:entrySet) {
			System.out.println("取得键:" + entry.getKey());
			System.out.println("对应的值为:" + entry.getValue().name);
		}
	}
	void testModify() {//测试修改
		System.out.println("请输入要修改的学生ID");
		Scanner cin = new Scanner(System.in);
		while(true) {
			//取得从键盘输入的学生ID
			String stuID = cin.next();
			//查找是否有相应的映射
			Student student = students.get(stuID);
			if(student == null) {
				System.out.println("该ID不存在 ,请重新输入");
				continue;
			}
			System.out.println("当前该学生ID ,所对应的学生为:" + student.name);
			System.out.println("请输入新的学生姓名");
			String name = cin.next();
			Student newStudent = new Student(stuID , name);
			students.put(stuID,newStudent);
			System.out.println("修改成功");
			break;
		}
	}
	void testContainsKey() {
		Scanner cin = new Scanner(System.in);
		System.out.println("请输入学生ID");
		String id = cin.next();
		System.out.println("您输入的学生ID是:" + id + "该学生的ID是否存在:"+students.containsKey(id));
	}
	/*
	 * 
	 * containsValue的方法需要调用equals方法和hashcode方法比较
	 */
	void testContainsValue() {
		Scanner cin = new Scanner(System.in);
		System.out.println("请输入要查询的学生姓名");
		String name = cin.next();
		System.out.println("该学生的姓名是否存在:" + students.containsValue(new Student(null,name)));
	}
}
public class Main {
   public static void main(String []args) {
      MapTest mt = new MapTest();
      mt.testPut();
      //mt.testKeySet();
      //mt.testRemove();
     // mt.testEntrySet();
      //mt.testModify();
      //mt.testEntrySet();
      mt.testContainsKey();
      mt.testContainsValue();
   }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值