黑马程序员-集合框架(2)



-----------------------android培训java培训、期待与您交流!----------------------

Map接口


以键值对的形式保存映射关系(key-value),其中key不允许重复因此按照保证键的唯一性的方式Map集合分为两大类:

HashMap:通过键的hashCode()和equals()方法保证键的唯一,其中HashMap中的任何对象包括null都可以作为键值。

TreeMap:通过CompareTo()方法保证键值的唯一;这里有实现比较的方式有两种:在集合元素的对象中实现CompareTo()方法,或者在定义TreeMap时在参数列表里给一个Comparator对象。



Map常用方法

void clear():删除该Map对象中所有的key-value对。也就是清理该集合;

boolean containsKey(Object key):查询Map中是否包含指定的key

boolean containsValue(Object  value):查询Map中是否包含至少一个value;

Set entrySet():返回Map所包含的key-value对所组成的Set集合,每个集合元素都是Map.Entry对象(EntryMap内部类)

Object get(Object key):返回指定key所对应的value,若此Map中不包含该key,返回null;

boolean isEmpty():判断Map集合是否为空;

Set keySet():返回该Map中所有key所组成的Set集合;

Object put(Object key,Object value):添加一个key-value对,若Map中已有与key相等的key-value对,则新的key-value对覆盖原来的key-value对;

void putAll(Map m):m中的key-value赋值到调用该方法的Map对象中;

Object remove(Object key):删除指定key所对应的key-value对,返回本删除key所关联的value,key不存在,返回null;

int size():返回该Map里面key-value对的个数;


Map.Entry:EntryMap接口里面的一个内部接口.该接口用于封装key- value,3个方法:

Object getKey();返回Entry里包含的key

Object getValue();返回Entry里包含的value

Object setValue(Object value):设置Entry里包含的value,并返回新设置的value;

 

Map集合的输出

按照最正统的做法,所有的Map集合的内容都要依靠Iterator输出,以上虽然是完成了输出,但是完成的不标准,Map集合本身并不能直接为Iterator实例化,如果此时非要使用Iterator输出Map集合中内容的话,则要采用如下的步骤:

 

方法一:

1.通过entrySet方法变成Set对象

2.调用SetIterator方法,此时每个Iterator对象是Map.Entry对象

3.Map.Entry分离出 key - value

方法二:

1.通过keySet得到Map集合多有keySet集合

2.调用SetIterator方法,此时每个Iterator对象是key

3.通过MapgetValue(key)得到value

 

示例代码:

<span style="color:#000000;">import java.util.*;
public class Demo {
	public static void main(String[] args) {		
		Map<Integer, String> m = new HashMap<Integer, String>();	
		m.put(1, "jack");
		m.put(2, "rose");
		m.put(3, "lucy");		
		//第一种方法
		Set s = m.entrySet();
		Iterator it = s.iterator();
		while(it.hasNext()){
			Map.Entry me = (Entry) it.next();
			System.out.println(me.getKey()+"  "+me.getValue());
		}
		//第二种方法	
		s = m.keySet();//得到的是key的集合
		it = s.iterator();//然后将key迭代出来
		while(it.hasNext()){
			int i = (int)it.next();
			System.out.println(i+"   "+m.get(i));
		}
	}
}</span>


案例:统计字符串中字母出现的次数

package itheima;
import java.util.*;
class MyComparator implements Comparator              //定义比较器
{
        Map tr;
        public MyComparator(Map map)
        {
                this.tr=map;
     }
          public int compare(Object o1,Object o2)
          {
                          Character c1=(Character)o1;
                          Character c2=(Character)o2;
                    Integer i1=(Integer)tr.get(o1);
                          Integer i2=(Integer)tr.get(o2);                  
                          int num=i2.compareTo(i1);
                          if(num==0)
                                  return c1.compareTo(c2);
                          return num;
          }
}
public class Test1 {
             public static void sop(Object obj)
             {
                System.out.println(obj);
             }
             public static String filter(String str)   //定义过滤输入字符串的方法,去掉除字母外的字符,返回输入的字母字符串
             {
                     StringBuffer a = new StringBuffer();
             char[] ch = str.toCharArray();
             for(char c:ch)
             {
                    if(c>='a'&&c<='z')
                     a.append(c);
                    }
             return a.toString();
             }
          public static void main(String[] args)
          {
                  Scanner scan = new Scanner(System.in);
                  String input = scan.nextLine();
              String str = filter(input);
              sop(charCount(str));
          }
          public static String charCount(String st){
                  char[] ch = st.toCharArray();
                  StringBuffer sb = new StringBuffer();
                  Map<Character,Integer> mp = new HashMap<Character,Integer>();
                  for(char c:ch){
                          Integer count = mp.get(c);
                          if(count==null)
                                  mp.put(c, 1);
                          else{
                                  count++;
                                  mp.put(c, count);
                          }
                  }
                  MyComparator myC=new MyComparator(mp);
                  TreeMap<Character,Integer> tm=new TreeMap<Character,Integer>(myC);
                  tm.putAll(mp);
     
                  Set<Character> keyset = tm.keySet();                   //调用KeySet方法遍历集合tm
                  Iterator<Character> it = keyset.iterator();
              while(it.hasNext()){
                      Character key = it.next();
                      Integer value = tm.get(key);
                      sb.append(key+"("+value+")");
              }
              return sb.toString();
          }
}


<span style="color:#000000;background-color: rgb(255, 255, 204);">package demo;

/*
需求:获取一个字符串中出现的字母及其出现次数。
分析:字符串每位上的字符进行遍历,然后将每位上的字符添加入定义好的一个Map集合。存储动作时加上判断,如果集合中不存在该键(字符作键),添加该键值(字符,1),如果存在则值加1.
步骤:
1.键盘获取一个字符串对象.
2.定义一个Map,遍历字符串,将每一位上的字符当作键,存入Map集合。
3.存储都做加上判断,集合中没有,则值为1,存入。集合中有,则将已有值加一存入。
4.遍历Map集合并打印,达到要求格式。
*/
import java.util.Map;
import java.util.TreeMap;
import java.util.HashMap;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
class ApearNum
{
	public static void main(String[] args)
	{
		Scanner in = new Scanner(System.in);
		System.out.println("请输入需要获取出现字母及其次数的字符串:");
		String str = in.nextLine();
		TreeMap <Character,Integer> strMap = new TreeMap<>();
		for(int i=0;i<str.length();i++)		//这里,突然想到增强for,适用于集合和数组,但不论从哪方面来说,String我都觉得他足够具有特殊性。
		//for(Character str.charAt(i) : str)		//所以这里,对增强for是否适用于String,进行了实验,事实证明,不行.
		//for(Character charI : str)
		{
			//Character temp =charI;
			Character temp=str.charAt(i);
			if(strMap.get(temp)==null)
			{
				strMap.put(temp,1);
			}
			else
			{
				strMap.put(temp,strMap.get(temp)+1);
			}
		}
		System.out.println(strMap);
		//TreeSet <Character> strSet = (TreeSet)strMap.keySet();   这里,运行出现类型转换异常,可以得知,keySet()得到的键集合是与Map对应的类型.
		//TreeSet <Character> strSet =(TreeSet)strMap.keySet();	为什么这里,我已经将Map改成TreeMap还是类型转换异常?
		//通过查看底层源码得知:虽然键集合的确符合TreeSet或者HashSet集合的特性,但他其实是SortedSet的一个子类,并不是想当然的是HashSet或者TreeSet.
		Set <Character>	strSet = strMap.keySet();
		StringBuilder strSB = new StringBuilder();
		for(Character key : strSet)
		{
			strSB.append("[").append(key+":").append(strMap.get(key)).append("] ");
		}
		System.out.println(strSB);
	}
}</span>


----------------------- android培训 java培训 、期待与您交流!----------------------

黑马训练营:http://edu.csdn.net/





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断路器保护灵敏度校验整改及剩余电流监测试点应用站用交流系统断

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值