黑马程序员:Java基础总结----Map集合

黑马程序员:Java基础总结



Map集合

  ASP.Net+Android+IO开发 .Net培训 、期待与您交流!




Map集合

key 和 value 的映射
该集合存储键值对。一对一对往里存。而且要保证键的唯一性
(key==null ? k==null : key.equals(k))

     1,添加。
          put(K key, V value) 
注意返回值是V
 Vput(K key, V value)
          将指定的值与此映射中的指定键关联(可选操作)。
          putAll(Map<? extends K,? extends V> m)

     2,删除。
          clear()
          remove(Object key)
注意返回值是V
 Vremove(Object key)
          如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。

     3,判断。
          containsValue(Object value)
          containsKey(Object key)
 booleancontainsKey(Object key)
          如果此映射包含指定键的映射关系,则返回 true
 booleancontainsValue(Object value)
          如果此映射将一个或多个键映射到指定值,则返回 true
          isEmpty()


     4,获取。
          get(Object key)
 Vget(Object key)
          返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null
          size()
          values()
 Collection<V>values()
          返回此映射中包含的值的 Collection 视图。
          entrySet()
 Set<Map.Entry<K,V>>entrySet()
          返回此映射中包含的映射关系的 Set 视图。
          keySet()
 Set<K>keySet()
          返回此映射中包含的键的 Set 视图。


接口 Map.Entry<K,V>

public static interface Map.Entry<K,V>
 KgetKey()
          返回与此项对应的键。
 VgetValue()
          返回与此项对应的值。

map集合的两种取出方式:
1, Set<k> keySet:将map中所有的键存入到Set集合。因为set具备迭代器。
     所有可以迭代方式取出所有的键,在根据get方法。获取每一个键对应的值。
         

     Map集合的取出原理:将map集合转成set集合。在通过迭代器取出。

//先获取map集合的所有键的Set集合,keySet();
Set<String> keySet = map.keySet();

//有了Set集合。就可以获取其迭代器。
Iterator<String> it = keySet.iterator();

while  (it.hasNext())
{
      String key = it.next();
        //有了键可以通过map集合的get方法获取其对应的值。
      String value  = map.get(key);
      System.  out  .println( "key:"  +key+  ",value:" +value);
}



2, Set<Map.Entry<k,v>> entrySet:将map集合中的映射关系存入到了set集合中,
                    而这个关系的数据类型就是:Map.Entry

                    Entry其实就是Map中的一个static内部接口。
                    为什么要定义在内部呢?
                    因为只有有了Map集合,有了键值对,才会有键值的映射关系。
                    关系属于Map集合中的一个内部事物。
                    而且该事物在直接访问Map集合中的元素

              //将Map集合中的映射关系取出。存入到Set集合中。
            Set<Map.Entry<String,String>> entrySet = map.entrySet();

            Iterator<Map.Entry<String,String>> it = entrySet.iterator();

              while (it.hasNext())
            {
                  Map.Entry<String,String> me = it.next();
                  String key = me.getKey();
                  String value = me.getValue();

                  System.  out .println(key+ ":"  +value);

            }


Map
    
     |--Hashtable:底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的。jdk1.0.效率低。
          |--HashMap:底层是哈希表数据结构,允许使用 null 值和 null 键,该集合是不同步的。将hashtable替代,jdk1.2.效率高。
          |--TreeMap:底层是二叉树数据结构。线程不同步。可以用于给map集合中的键进行排序。



和Set很像。
其实大家,Set底层就是使用了Map集合



注意了,当发现有映射关系时,可以选择map集合。
因为map集合中存放就是映射关系

练习:
"sdfgzxcvasdfxcvdf"获取该字符串中的字母出现的次数。

希望打印结果:a(1)c(2)....

思路:
1,将字符串转换成字符数组。因为要对每一个字母进行操作。

2,定义一个map集合,因为打印结果的字母有顺序,所以使用treemap集合。

3,遍历字符数组。
     将每一个字母作为键去查map集合。
     如果返回null,将该字母和1存入到map集合中。
     如果返回不是null,说明该字母在map集合已经存在并有对应次数。
     那么就获取该次数并进行自增。,然后将该字母和自增后的次数存入到map集合中。覆盖调用原理键所对应的值。

4,将map集合中的数据变成指定的字符串形式返回


import  java.util.*;
public  class    Ts
{
        public  static  void  main(String[] args)
      {
            String s= charCount( "ak+abAf1c,dCkaAbc-defa" );
            System.  out .println(s);
      }
      
        public  static  String charCount(String str)
      {
              char [] chs = str.toCharArray();

            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]);

                  
                    if (value!= null )
                        count = value;
                  count++;
                  tm.put(chs[x],count);  //直接往集合中存储字符和数字,为什么可以,因为自动装箱。

                  count = 0;
                    /*
                  if(value==null)
                  {
                        tm.put( chs[x],1);
                  }
                  else
                  {
                        value = value + 1;
                        tm.put( chs[x],value);
                  }
                  */


            }

              //System.out.println(tm);

            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();
      }

}





  ASP.Net+Android+IO开发 .Net培训 、期待与您交流!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值