问答详情
源自:5-4 学生选课---修改 Map 中的学生

Map映射中获取键值对的value值问题,报错的地方,为什么value是一个Collection类而不是Set或者其他的?

package com.imooc.collection;



import java.util.Collection;

import java.util.HashMap;

import java.util.Iterator;

import java.util.Map;

import java.util.Map.Entry;

import java.util.Scanner;

import java.util.Set;


public class testMap {

/**

* 用来承装学生类型对象

*/

public Map<String, Student> students;

public testMap(){

this.students=new HashMap<String,Student>();

}

/**

* 添加学生,并判断是否被占用

*/

public void testPut(){

Scanner sc=new Scanner(System.in);

int i=0;

while(i<3){

System.out.println("请输入第"+i+"学生姓名ID:");

String id=sc.nextLine();

Student stu=students.get(id);

if(stu==null){

//提示输入姓名

System.out.println("请输入第"+i+"学生姓名");

String name=sc.nextLine();

Student st=new Student(id, name);

students.put(id,st);

System.out.println("成功添加学生:"+students.get(id).name);

i++;

}else{

System.out.println("您输入的ID已被占用,请重新输入!");

continue;

}

}

}

/**

* 测试Map的ketSet方法

*/

public void testKeySet(){

System.out.println("总共有"+students.size()+"个学生!");

//通过keySet方法,返回Map中的所有“键”的set集合

Set<String> keySet=students.keySet();

// 遍历keySet,取得每一个键,在调用get方法取得每个键对应的value

for(String stuid:keySet){

Student st=students.get(stuid);

if(st!=null)

System.out.println("学生:"+st.name);

}

}

/**

* 测试删除Map中的映射

* @param args

*/

public void testRemove(){

Scanner sc=new Scanner(System.in);

while(true){

System.out.println("请输入要删除的学生ID:");

String id=sc.nextLine();

//判断id是否有对应的学生对象

Student st=students.get(id);

if(st==null){

System.out.println("该id不存在");

continue;

}else{

students.remove(id);

System.out.println("成功删除学生:"+st.name);

break;

}

}

}

/**

* 通过entrySet方法遍历Map

* @param args

*/

public void testEntrySet(){

Set<Entry<String,Student>> entrySet=students.entrySet();

for(Entry<String,Student> entry:entrySet){

System.out.println("取得键"+entry.getKey());

System.out.println("对应的值为"+entry.getValue().name);

}

}

/**

* 通过迭代器 分别遍历students中的key和value

* @param args

*/

public void mapIterator(){

Set<String> set=students.keySet();

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

System.out.println();

System.out.println("key集合中的元素:");

while(it.hasNext()){

System.out.println(it.next());

}

Set<Student> col=students.values();

Collection<Student> coll=students.values();

Iterator<Student> iit=col.iterator();

System.out.println("Value集合中的元素:");

while(iit.hasNext()){

Student st=iit.next();

System.out.println("我是学生:"+st.id+",我的名字是:"+st.name);

}

}

public static void main(String[] args) {

testMap tm=new testMap();

tm.testPut();

tm.testKeySet();

tm.testRemove();

tm.testEntrySet();

tm.mapIterator();

}

}






提问者:qq_踏雪飞鸿_1 2017-03-19 11:33

个回答

  • nuanchazy
    2017-09-05 18:14:30

    value是一个Collection类,Collection包含了:Set、List和Queue。他可以是Set也可以是List亦可以是Queue。程序中的value是Student,未用泛型规定其为Set或List类,就是默认的Collection类。当然你也可以用泛型规定value是指定类型类。例如:

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

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


  • 桥米
    2017-04-12 14:17:46

    value值是可以重复的,key值是不可重复的,所以只有key值集合属于Set集合

  • 昏_沉沉
    2017-03-19 16:47:15

    Set是一种不包含重复的元素的Collection