黑马程序员——Map集合

---------------------- 黑马程序员 Android培训、期待与您交流! ----------------------


Map集合的特点

l           Map与Collection在集合框架中属并列存在

l         Map存储的是键值对

l         Map存储元素使用put方法,Collection使用 add方法

l         Map集合没有直接取出元素的方法,而是 先转成Set集合,在通过迭代获取元素

l         Map集合中键要保证唯一性


KeySet的取值方式


/*

 * map集合的两种取出方式

 * 1.KeySet: Map中所有的键存入到Set集合,因为Set具备迭代器。

 *  所以可以迭代方式取出所有的键,再根据get方法,获取每一个键对应的值。

 *

 * Map集合的取出原理,将Map集合转成set集合,再通过迭代器取出。

 *

 */

import java.util.*;
public class _02_Map_KeySet {
	
	public static void main(String[]args)
	{
		Map<Integer,String> map = new HashMap<Integer,String>();
		map.put(02,"zhangsan02");
		map.put(04,"zhangsan04");
		map.put(01,"zhangsan01");
		map.put(03,"zhangsan03");

		//先获取Map集合中所有键的Set集合。KeySet();
		Set<Integer> keySet = map.keySet();
		
		//有了Set集合,就可以获取其迭代器
		Iterator<Integer> it = keySet.iterator();
		while(it.hasNext())
		{
			Integer key = it.next();
			
			//有了键,可以通过Map集合的get方法获取其对应的值。
			String value = map.get(key);
			
			System.out.println("key:"+key+"value:"+value);
		}
		
		
	}

}

Entryset


 * 2,entrySet: 返回的是Set<Map.Entry<K,V>>

 *      |--entrySet:将集合中的映射关系(映射关系相当于丈夫和妻子的结婚证)

 *                   存入到了Set集合中,而这个关系的数据类型就是Map.Entry

 *    

 *

 *      |--Map.Entry:其实Entry也是一个接口,它是Map接口中的内部接口(代码如下示)

 *

 interface Map

{

    public static interface Entry

    {

       public abstract Object getKey();

       public abstract Object getValue();

    }

}

class HashMap implements Map

{

    class Hash implements Map.Entry

    {

       public Object getKey(){}

       public Object getValue(){}

    }

import java.util.*;

public class _03_Map_entrySet {
	
	public static void main(String[]args)
	{
		Map<Integer,String> map = new HashMap<Integer,String>();
		map.put(02,"lisi2");
		map.put(03,"lisi3");
		map.put(01,"lisi1");
		map.put(04,"lisi4");
		
		Set<Map.Entry<Integer,String>> entry = map.entrySet();
		Iterator<Map.Entry<Integer,String>> it = entry.iterator();
		while(it.hasNext())
		{
			Map.Entry<Integer,String> me = it.next();
			Integer key = me.getKey();
			String value = me.getValue();
			System.out.println("key:"+key+",value:"+value);
		}	
		/*
		//将Map集合中的映射关系,存入到Set集合中
		//Set集合接收的是    《返回的映射关系Map.Entry<包含的数据类型K(丈夫),V(妻子)>》
		Set<Map.Entry<Integer,String>> entry = map.entrySet();
		
		//调用Set集合的迭代器
		Iterator<Map.Entry<Integer,String>> it = entry.iterator();
		while(it.hasNext())
		{
			//获取输出的映射关系   it.next()返回的是映射关系(K,V);
			Map.Entry<Integer,String> me = it.next();
			
			//定义数据类型接收获取的键值
			Integer Key = me.getKey();
			//定义数据类型接收获取的数据
			String value = me.getValue();
			System.out.println("key:"+Key+",value:"+value);
		}
		*/
	}

}

Map集合常用类

 

l         Hashtable:线程安全,速度慢,不允许存放 null键,null值,已被HashMap替代。

 

l         HashMap:线程不安全,速度快,允许存放null 键,null值。

 

l         TreeMap:对键进行排序,排序原理与TreeSet 相同。


经典小练习

TreeMap练习,字母出现的次数
 
/*
 * 练习:
 * “sdfgzxcvasdfxcvdf”获取该字符串中的字母出现的次数。
 * 
 * 希望打印结果a(1)c(2)..
 * 
 * 通过结果发现,每一个字母都有对应的次数,说明字母和次数之间都有映射关系。
 * 
 * 注意了:当发现有映射关系时,可以选择map集合。
 * 因为map集合中存放就是映射关系。
 * ---------------------------------------------
 * 什么时候使用Map集合呢?
 * 当数据之间存在着映射关系时,就要先想到Map集合。
 * ---------------------------------------------
 * 思路:
 * 1,将字符串转换成字符数组。因为要对每一个字母进行操作。
 * 2,定义一个Map集合,因为打印的字母有顺序,所以使用TreeMap集合。
 * 3,遍历字符数组。
 *    将每一个字母作为键去查Map集合。
 *    如果返回null,将该字母和1存入到Map集合中 。
 *    如果返回不是null,说明该字母在Map集合中已经存在,并有对应的次数。
 *    那么就获取该次数,并进行自增,然后将该字母和自增后的次数存入到Map集合中,
 *    覆盖掉原来键所对应的值
 *    
 * 4,将Map集合中的数据变成指定的字符串形式返回。
 */
import java.util.*;
public class _06_TreeMap练习_字母出现的次数 {
	
	public static void main(String[]args)
	{
		String s = charCount("aab,ca.bd+fef-a");
		System.out.println(s);
	}
	public static String charCount(String str)
	{
		//接收char数组
		char[] chs = str.toCharArray();
		
          //注意泛型接收的是引用数据类型,不能直接写char,int基本数据类型
          //所以要去找它们对应的数据包装类型。
		//使用TreeMap集合进行排序
		TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();
		
		//进行遍厉
		int count = 0;
		for(int x=0;x<chs.length;x++)
		{
			if(!(chs[x]>='a' && chs[x]<='z' || chs[x]>='A' && chs[x]<='Z'))//不是字母之间
			{
				continue;
			}
			Integer value = tm.get(chs[x]); //通过chs[x]键,获取值
			
			if(value!=null)
			{
				count = value;
			}
			count++;
			tm.put(chs[x], count);
			count=0;//用完一次后,进行清0;

			/*
			if(value==null)
			{
				tm.put(chs[x],1);
			}
			else
			{
				value = value+1;
				tm.put(chs[x],value);
			}
			*/
		}
		//打印集合
		//System.out.println(tm);
		
		//使用缓冲容器StringBuilder存储遍历对象
		StringBuilder sb = new StringBuilder();
		
		Set<Map.Entry<Character,Integer>> entrySet = tm.entrySet();
		Iterator<Map.Entry<Character,Integer>> it = entrySet.iterator();
		while(it.hasNext())
		{
			Map.Entry<Character,Integer> me = it.next();//接收映射
			Character ch = me.getKey();
			Integer value = me.getValue();
			sb.append(ch+"("+value+")");
		}
		
		
		return sb.toString();
	}
}



---------------------- 黑马程序员 Android培训、期待与您交流! ----------------------


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值