您的位置:首页 > 编程语言 > Java开发

9、Java入门—集合框架(中)

2016-10-21 13:10 337 查看
Map接口——

1.Map提供了一种映射关系,其中的元素是以键值对(key - value)的形式存储的,能够实现根据key快速查找value

2.Map中的键值对以Entry类型的对象实例形式存在

3.键(key值)不可重复,value值可以重复

4.每个键最多只能映射到一个值

5.Map接口提供了分别返回key值集合,value值集合以及Entry(键值对)集合的方法

6.Map支持泛型,形式如:Map<K,V>

7、Map中通过put()方法添加键值对(两个参数,key和value),不同于Collection中的add()方法

8、Map中的keySet()方法、entrySet()方法和values()方法分别返回Map集合中的键值集合、键值对集合和值集合

9、Map中通过remove()方法删除键值对(一个参数,key)

HashMap是Map集合的重要实现类,也是最常用的,基于哈希表实现

HashMap中的Entry对象是无序列的,

Key值和VALUE值都可以为NULL,但是一个HashMap只能有一个key值和null的映射,(key值不可重复,value值可以重复)

HashMap——添加

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

String ID=in.next();

Student st=students.get(ID);//获取values

if(st==null){//判断该ID是否被占用

String name=in.next();

Student newst=new Student(ID,name);

students.put(ID,newst);

}

HashMap——查询(keySet)

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

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

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

for(String stuId:keySet){

Student st=students.get(stuId);

if(st!=null){

st.name...;

}

}

Ps:由于Set无序,所以遍历出来的顺序可能不一样。





Map集合常用的实现类有HashMap,Hashtable,treeMap

Map是以键-值对形式出现的

其中HashMap是无序的,每次输出的顺序都不一样

使用方法为:

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

可以使用集合的方式打印输出Map中的元素,其中Set集合是不允许有重复元素的

使用方法:

Set<String,Student> su = students.getKey();

  注释: getKey()是返回Student中所有"键"所对应的值

利用循环遍历时:

for(String sr : su){

   Student st = students.get(sr);

   注释:get()是Map方法中得到每一个键对应的Value值

}

Entry是Map的一个内部类,Set<Entry<String,Student>> entrySet = students.entrySet();

Map增删改查:

增:map的put(key,value)方法添加。

查:1.利用keyset()方法获得Map中key的集合,再遍历key的集合,利用Map的get(key)方法得到key对应的value值。

2.利用EntrySet方法获取May中Entry对象集:然后用foreach遍历集,再用Entry集的getkay()和getvalue()方法得到每一个key值和value值。

删:remove(object key)

改:put(原有的key,新的value)

通过entrySet可以返回Map中的所有键值对

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

我需要在程序的不同的地方创建多个scanner对象读取一整行信息,每次用完后都很自然得调用了close方法关掉,当第二个scanner对象调用nextLine时就会出现NoSuchElementException: No line found的异常。想知道为什么。

sc.close()会把System.in也关掉,所以...

如果第一个scanner对象不关掉,就不会报错。





Map

-特点:元素成对出现,key-value,是映射关系,key不能重复,但value可以重复,也就是说,可以多key对一个value。支持泛型如Map<yy1, yy2>。

-其“儿子”HashMap是最常用的,HashMap中是无序排列,其元素中key或value可为null(但只能有一个为null)。

-声明(泛型)举例:

在类中声明 public Map<String, yy> xxx; 然后再构造方法中this.xxx = new hashMap<String,yy>();

-获取:yy temp = xxx.get( key(本例string型) )

-添加:xxx.put( key(string型), zz(yy型) );

-返回map中所有key(返回是set型集合形式) set<string> xxxxx = xxx.keyset();

用于遍历。

-返回map中所有entry对(key-value对)(返回是set型集合形式)

set<Entry<string, yy>> xxxxx = xxx.entrySet(); 同样用于遍历。

遍历时:for(Entry<string,yy> 元素: xxxxx)

-删除:xxx.remove(key);

-修改:也是用put,当put方法传入的key存在就相当于是修改(覆盖)

一。循环方法

     while(true)死循环配合if做出判断,再利用continue和break控制循环

②在这里我犯了一个错误,就是判断了ID是否存在。其实应该判断的是ID对应的Studengt对象是否存在。



/**
* 利用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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: