java-16(3)-Map集合

1.Map集合

一次添加一对元素,称为双列集合,Collection一次存储一个元素,称为单列集合。
其实Map集合中存储的是键值对,Map集合必须保证键的唯一性。

2.Map集合常用的方法:

1.添加:
    value put(key,value);返回前一个和key关联的值,如果没有就返回null.
2.删除:
    void clear();清空map集合
    value remove();根据指定的key删除这个键值对,并返回值。
3.判断:
    boolean containsKey(key);
    boolean containsValue(value);
    boolean isEmpty();
4.获取;
    value get(key);
    通过键拿值,如果没有该键就返回null;可以通过返回null,来判断是否包含指定键。
    int size();获取键值对的个数。

3.Map集合如何取出元素。

在Map集合中是没有迭代器的,所以它要取出元素,必须经过一系列的转化。
这里有三种方式:
1.Collection<V> values();返回此映射中包含的值得Collection视图。
2.Set<V> KeySet();返回此映射中包含键的Set视图。
3.Set<Map.Entry<K,V>> entrySet();返回此映射中包含的映射关系的Set视图。   
public static void main(String[] args){
        Map<Integer,String> map = new HashMap<>();
        method1(map);
        method2(map);
        method3(map);

    }

(1).Collection values();方式


public static void method1(Map<Integer, String> map) {
  map.put(8,"WangWu");
  map.put(2,"Zhaoliu");
  map.put(7,"XiaoQiang");
  map.put(6,"WangCai"); 

  Collection<String> values = map.values();
  for(Iterator<String> it = values.iterator();it.hasnext;){
      System.out.println(it.next());
  }
}

(2)

/*
Set<Map.Entry<K,V>> entrySet();
原理:该方法将键和值的映射关系作为对象存储到Set集合中,而这个映射关系的类型就是Map.Entry类型。
*/

public static void method2(Map<Integer, String> map) {
  map.put(8,"WangWu");
  map.put(2,"Zhaoliu");
  map.put(7,"XiaoQiang");
  map.put(6,"WangCai"); 

  Set<Map.Entry<Integer,String>> keySet = map.entrySet();
 for(Iterator<Map.Entry<Integer,String>> it = keySet.iterator();it.hasnext;){
     Map.Entry<Integer,String> me = it.next();
     Integer key = me.getKey();
     String value = me.getValue(key);

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

(3)

/*
Set<V> KeySet();
原理:通过keySet方式获取map中所有的键所在的set集合,
再通过Set的迭代器获取到每一个键,再对每一个键获取对应的值即可。
*/

public static void method2(Map<Integer, String> map) {
  map.put(8,"WangWu");
  map.put(2,"Zhaoliu");
  map.put(7,"XiaoQiang");
  map.put(6,"WangCai"); 

  Set<Integer> keySet = map.keySet();
 for(Iterator<Integer> it = keySet.iterator();it.hasnext;){
     Integer key = it.next();
     String value = map.get(key);

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

4 Map常用的子类:

HashTable:内部数据结构是哈希表是同步的,不允许null作为键,null作为值。
  Properties:用来存储键和值对型的配置文件的信息,可以与IO技术相结合。

HashMap:内部数据结构是哈希表,不同步。不允许null作为键,null作为值。
 LinkedHashMap:内部数据结构是链表和哈希表,可以实现存取一致(顺序)。

TreeMap:内部数据结构是二叉树,不同步。可以对集合中的键进行排序。

5.MapTest

/*
* 练习
* "fdgavcbsacdfs"获取该字符串中,每一个字母出现的次数。
* 要求打印结果为:a(2)b(1)...
* 思路;
* 1.首先 因为操作的是字符串中的字母,所以将字符串转换为字符数组。
* 2.然后观察到字母和该字母出现的次数存在一一对应的关系。这里可以想到用Map或者数组。但是出现的次数是无序的,所以要使用Map集合。
* 又因为打印结果是按照一定顺序的,所以想到TreeMap集合,字母作为键,出现的次数作为值。
* 3.把字符数组中的每个元素取出查Map表,如果该键没有在表中,则把该键和对应的值(1)存入。如果该键存在,那么将该键对应的值取出自增1后,
* 再存入Map表中。
* 4.当字符数组遍历完成后,Map表中就存储了全部字母出现的次数。
* 5.然后把Map表按照特定的方式转成字符串输出。
*
*
*/
    public static void main(String[] args){
        String str = "fdg3//avi249cccb++sac565dfs";
        str = getCharCount(str);
        System.out.println(str);
    }

    public static String getCharCount(String str) {
        //将字符串转为字符数组。
        char[] chs = str.toCharArray();
        //创建Map表
        TreeMap<Character,Integer> map = new TreeMap<>();
        //取出元素进行查表
        for (int i = 0; i < chs.length; i++) {
            if (!(chs[i] >= 'a' && chs[i] <= 'z')||(chs[i] >= 'A' && chs[i] <= 'Z')) {
                continue;
            }
            Integer value = map.get(chs[i]);
            if ( value == null){
                //表中没有该元素,直接插入。
                map.put(chs[i],1);
            }else{
                //表中存在该元素,把value取出+1然后在进行存入
                map.put(chs[i],++value);
            }

        }
        //把map表转为特定的字符串
        String st = getMapSring(map);

        return st;

    }

    private static String getMapSring(TreeMap<Character, Integer> map) {
        StringBuilder sb = new StringBuilder();
        //遍历map表
        /*for (Iterator<Map.Entry<Character,Integer>> it = map.entrySet().iterator();it.hasNext();){
            Map.Entry<Character,Integer> me = it.next();
            Character key = me.getKey();
            Integer value = me.getValue();
            sb.append(key+"("+value+") ");
        }*/
        //遍历map表foreach
        for (Map.Entry<Character,Integer> me:map.entrySet()) {
            Character key = me.getKey();
            Integer value = me.getValue();
            sb.append(key+"("+value+") ");
        }

        return sb.toString();
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值