HashMap通过value遍历key的两种方式

HashMap:通过key遍历value以及通过value遍历key实例演示

一.通过key遍历value

1.通过keySet取出 map元素使用for-each循环

import java.util.*;
import java.util.Set;
import java.util.Map;
public class HashMapExample {
     
    public static void main(String[] args){
     
        Map<String,String>map=new HashMap<>();
        //存入map
        map.put("1","第一个值");
        map.put("2","第二个值");
        map.put("3","第三个值");
        //通过keySet for-each循环取出map中的value
        Set<String>Key=map.keySet();//将map中的key作为Set集合的元素
        for(String key:Key){
     
            System.out.println("key="+key+",value:"+map.get(key));
        }
    }
}

结果:
HashMap通过value遍历key的两种方式_第1张图片

注意:String类型的hashcode和equals已经重写过,如果是自定义对象作为key和value时需要将hashcode和equals重写,否则存入会有重复不符合要求的元素。

通过keySet()遍历获取可以发现,只要我们得到对应的key,再通过map.get(key)就可以直接获得对应value,这就是为什么HashMap以key-value形式存储数据,简单地获得key就可以获得对应的value。
步骤如下:
1.将map中的key单独地作为Set集合的元素。
2.遍历Set集合的key。
3对应的key通过map.get(key)获得对应的value。

2.通过keySet取出 map元素使用Iterator遍历

//通过Iterator遍历keySet
System.out.println("通过Iterator遍历map中的key");
Iterator<String>it=map.keySet().iterator();//用迭代器遍历map中的key
while(it.hasNext()){
     
    String key= it.next();
    System.out.println("key="+key+",value:"+map.get(key));
}

结果:HashMap通过value遍历key的两种方式_第2张图片
可以看出Iterator和for-each都是遍历的方式,在这里,通过迭代器的移动,对元素进行判断和取值,步骤如下:
1.用迭代器遍历map中的key。
2.it.hasNext()若返回true,表示接下来还有元素,继续移动。
3.String key= it.next(); 返回迭代器刚刚经过的元素key。
4.通过key获取value,map.get(key)。

3.通过EntrySet取出 map元素使用for-each遍历

//通过for-each遍历entrySet
System.out.println("通过for-each遍历entrySet");
Set<Map.Entry<String,String>>entry= map.entrySet();
for(Map.Entry<String,String> entrys:entry){
     
    System.out.println("key="+entrys.getKey()+",value:"+entrys.getValue());
}

结果:
HashMap通过value遍历key的两种方式_第3张图片
Map.Entry是Map声明的一个内部接口,定义为Entry,表示Map中的一个实体(key-value对),一个Entry里有一个键值对,Entry表示一个映射项(里面有key和value),这么做的好处是,我们不必每次都通过key去获取value,直接从Entry取得。
步骤为:
1.将entrySet中的映射Entry放入Set集合,此时集合里是一个个键值对。
2.遍历Set集合。
3.通过entrys.getKey(),和entrys.getValue()获得相应的key-value。

entrySet是Java中key-value的集合,而Entry就是entrySet集合中的一个键值对。

4.通过EntrySet取出 map元素使用Iterator遍历

//通过Iterator遍历entrySet
System.out.println("通过Iterator遍历entrySet");
Iterator<Map.Entry<String,String>>it1=map.entrySet().iterator();
while(it1.hasNext()){
     
    Map.Entry<String,String>entry1=it1.next();
    System.out.println("key="+entry1.getKey()+",value:"+entry1.getValue());
}

结果:
HashMap通过value遍历key的两种方式_第4张图片直接使用Iterator对entrySet()中的映射Entry进行遍历,就可以得到其对应的key和value
步骤:
1.用迭代器遍历entrySet中的映射Entry。
2.it.hasNext()若返回true,表示接下来还有元素,继续移动。
3.Map.Entryentry1=it1.next();就是代器刚刚经过的元素Entry中的键值对
4.通过entry1.getKey()和entry1.getValue()获取key和value

5.通过for-each直接取出 map中的value

//直接通过for-each遍历Map通过map.value获取值
System.out.println("通过map.value获取值");
for(String v: map.values()){
     
    System.out.println("value:"+v);
}

结果:
HashMap通过value遍历key的两种方式_第5张图片

直接通过map.Values()遍历所有的value,但不能遍历key。

二.HashMap中通过value遍历key

1.通过已知的value遍历对应的key(EntrySet方法)

ublic class HashMapExample {
     
    //根据value查key
    public static  List<String>getValue(Map<String,String>map,String value){
     
        List<String>list=new ArrayList<String>();
        Set<Map.Entry<String,String>>set=map.entrySet();//将entrySet集合中的映射Entry放到集合Set中,每一个键值对就是一个元素
        for(Map.Entry<String,String>entry:set){
     //遍历Set中,也就遍历了所有的key和value
            if(entry.getValue().equals(value)) {
     //如果Set集合中的值和我们要的值一样时,在集合中添加key值
                list.add(entry.getKey());
            }
        }
        return list;
    }
    public static void main(String[] args){
     
        Map<String,String>map=new HashMap<>();
        //存入map
        map.put("1","第一个值");
        map.put("2","第二个值");
        map.put("3","第三个值");
        map.put("4","第一个值");
        System.out.println(getValue(map,"第一个值"));
    }
}

以上我们想通过value,也就是"第一个值“,找到这个value所对应的key,结果如下:
在这里插入图片描述以上结果确实通过value找到了两个key。

map中一个value可以有多个key,但不能有相同的key。

2.通过已知的value遍历对应的key(keySet方法)

List<String>list=new ArrayList<String>();
for(String key: map.keySet()) {
     //直接遍历map中的key
    if (map.get(key).equals(value)) {
     //通过key获得的value如果和预设的value一致,说明找到了此key,添加到集合中
        list.add(key);
    }
}
return list;

既然entrySet方法可以通过value获取key,那么通过keySet也是可以的,entrySet是遍历键值对,而keySet直接遍历key,只要替换刚刚的部分代码就可以实现。
结果:
在这里插入图片描述

3.未知value遍历对应的key

Map<String,String>map=new HashMap<>();
    List list1=new ArrayList();//建立List集合
    //存入map
    map.put("1","第一个值");
    map.put("2","第二个值");
    map.put("3","第三个值");
    map.put("4","第一个值");
    // list里为value:key
    System.out.println("投进List");
    List<String>list=map.entrySet().stream().map(m->String.format("%s:%s",m.getValue(),m.getKey())).collect(Collectors.toList());
    for (String s:list){
     //遍历list,list里包含了key和value,通过stream方法可以筛选我们所需要的对象。
        System.out.println(s);
        list1.add(s);
        //System.out.println(s);
    }
    System.out.println(list1);
}

以集合的形式显示value:key
结果:
HashMap通过value遍历key的两种方式_第6张图片

也可以输出成Map形式:value作为key,value:key作为value

Map<String,String>map=new HashMap<>();
List list1=new ArrayList();
//存入map
map.put("1","第一个值");
map.put("2","第二个值");
map.put("3","第三个值");
map.put("4","第一个值");
Map<String,List<String>> map2=map.entrySet().stream().map(m->String.format("%s:%s",m.getValue(),m.getKey())).collect(Collectors.groupingBy(s -> s.split(":")[0]));
System.out.println("投进map");
for (Map.Entry<String,List<String>>e:map2.entrySet()){
     
    System.out.println(e);
}

结果:
HashMap通过value遍历key的两种方式_第7张图片

List常用功能中的stream有几个接口:collect()收集接口,把流转换为集合类(List、Map、Set),filter()过滤方法,返回stream流,熟练使用我们可以得到任意类型的集合。

总结:
无论是通过key获取value,或者通过value获取key,我们都是可以实现的,方法也比较多,我们可以在实际的开发过程中选择合适的方法,如果大家还有什么好的建议可以留言评价,谢谢。

你可能感兴趣的:(Java集合,java,hashmap)