zoukankan      html  css  js  c++  java
  • [置顶] Guava学习之Multimap

    相信大家对Java中的Map类及其之类有大致的了解,Map类是以键值对的形式来存储元素(Key->Value),但是熟悉Map的人都知道,Map中存储的Key是唯一的。什么意思呢?就是假如我们有两个key相同,但value不同的元素需要插入到map中去,那么先前的key对应的value将会被后来的值替换掉。如果我们需要用Map来把相同key的值存在一起,代码看起来像下面一样:

    /**
     * 
     */
    package com.wyp.Map;
    
    /**
     *@User: 过往记忆
     *@Date: 2013-7-9
     * Email: wyphao.2007@163.com
     *
     **/
    
    public class Person {
    	//姓名
    	private String name;
    	//年龄
    	private int age;
    	//性别
    	private String sex;
    	
    	/**
    	 * 
    	 */
    	public Person() {
    		
    		// TODO Auto-generated constructor stub
    	}
    
    	/**
    	 * @param name
    	 * @param age
    	 * @param sex
    	 */
    	public Person(String name, int age, String sex) {
    		super();
    		this.name = name;
    		this.age = age;
    		this.sex = sex;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public int getAge() {
    		return age;
    	}
    
    	public void setAge(int age) {
    		this.age = age;
    	}
    
    	public String getSex() {
    		return sex;
    	}
    
    	public void setSex(String sex) {
    		this.sex = sex;
    	}
    
    	@Override
    	public String toString() {
    		return "Person [name=" + name + ", age=" + age + ", sex=" + sex + "]";
    	}
    }
    
    下面进行
    //性别统计
    public void genderStatistics(List
      
        personList){
    	if(personList == null){
    		return;
    	}
    
    	Map<String, List
       
        > map = new HashMap<String, List
        
         >();
    	for(Person person : personList){
    		String sex = person.getSex();
    		List
         
           persons = map.get(sex);
    		if(persons == null){//第一次加入
    			persons = new ArrayList
          
           ();
    		}
    
    		persons.add(person);
    		map.put(sex, persons);
    	}
    
    	for (Entry<String, List
           
            > entry : map.entrySet()) {
    		String key = entry.getKey();
    		System.out.println(key + "	" + entry.getValue());
    	}
    }
    
           
          
         
        
       
      

    虽然实现了功能,但是代码比较长,但是如果你用Guava去实现同样的功能,你会发现你的代码一下子变少了。Guava提供了下面的结构

    import com.google.common.collect.ArrayListMultimap;
    import com.google.common.collect.Multimap;
    
    Multimap<K, V> myMultimap = ArrayListMultimap.create();

    从名字可以看出,Multimap可以存放的key值是不唯一的,Multimap并没有实现 Map 的接口,所以不需要达到键唯一的要求。如果存放了key一样的元素,Multimap并不会覆盖以前相同的key元素,而是加进去了。结果有点像{k1=[v1, v2, v3], k2=[v7, v8],….}其中v1, v2, v3对应的key都是k1,而如果是Map,则它的结果有点像{k1=v1, k2=v2,…}看到区别了吧?那么,用Multimap实现上面同样的功能代码有点像

    Multimap<String, Person> myMultimap = ArrayListMultimap.create();
    for (Person person : personList) {
    	String sex = person.getSex();
    	myMultimap.put(sex, person);
    }
    
    Map<String, Collection<Person>> map1 = myMultimap.asMap();
    for (Entry<String, Collection<Person>> entry : map1.entrySet()) {
    	String key = entry.getKey();
    	System.out.println(key + "	" + entry.getValue());
    }

    看到了吧,代码简单多了吧!这里有一点你可能会疑惑,就是为何get方法返回的是一个Collection而不是list,这是因为前者会更加有用。如果你需要基于multimap直接操作list或者set,那么可以在定义类型的时候使用子类名称:ListMultimap,SetMultimap和SortedSetMultimap。例如:

    ListMutlimap<String,Person> myMutlimap = ArrayListMultimap.create();
    // Returns a List, not a Collection.
    List<Person> myValues = myMutlimap.get("myKey");

    (完)



     

  • 相关阅读:
    课程5:Spring框架2016版视频--视频列表目录
    TAQSkinScrollBar 类美化滚动条再讨论
    C#区分多态和重载-delphi也类似
    Delphi之静态方法,虚方法virtual,动态dynamic,抽象abstract,消息
    课程4:黑马程序员_spring2.5视频教程--视频列表
    在 Delphi 中判断一个字符是中文的方法
    salesforce 零基础学习(四十八)自定义列表分页之Pagination基类封装 ※※※
    salesforce 零基础学习(四十七) 数据加密简单介绍
    salesforce 零基础学习(四十六)动态美观显示列表中记录的审批状态
    salesforce 零基础学习(四十五)Approval Lock & UnLock相关注意事项
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3181861.html
Copyright © 2011-2022 走看看