[置顶] 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: [email protected]

 *

 **/



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 + "\t" + 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 + "\t" + 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");

 

(完)



 

 

 

你可能感兴趣的:(guava)