java中集合的结构Map类型

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
    
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值