• 利用multimap给数据高效分类(1)


    背景:

    iTOO大小题算是最复杂逻辑,虽然查出来的数据是排序的,但是遇到大小题题型就需要重新排序,简而言之,需要对数据进行分组。什么是复杂大小题?看下图吧:


    代码

    所以就要给数据分组:

    private List<QuestionMain> sortQuestionMains(List<QuestionMain> lists){
    	//分类为大小题和不是大小题
    	List<QuestionMain> noQuestionMains=new ArrayList<QuestionMain>();
    	List<QuestionMain> hasQuestionMains=new ArrayList<QuestionMain>();
    	List<QuestionMain> sumQuestionMains=new ArrayList<QuestionMain>();
    	
    	ListMultimap<String,QuestionMain>getMutimap=ArrayListMultimap.create();
    	Iterator iterator =lists.iterator();
    	while (iterator.hasNext()) {
    		QuestionMain questionMain = (QuestionMain) iterator.next();
    		if (questionMain.getIsParentQuestion()==1) {			
    			getMutimap.put(questionMain.getId(), questionMain);
    		}else if (questionMain.getParentQuestionId()!=null){
    			getMutimap.put(questionMain.getParentQuestionId(), questionMain);
    		}else{
    			noQuestionMains.add(questionMain);
    		}		
    	}
    
    	if (getMutimap.size()>0) {
    		
    		Map<String, Collection<QuestionMain>> map1=getMutimap.asMap();
    		for(java.util.Map.Entry<String, Collection<QuestionMain>> entry : map1.entrySet()){
    			String key=entry.getKey();
    			List<QuestionMain> getlist=new ArrayList<QuestionMain>();
    			getlist= (List<QuestionMain>) entry.getValue();
    			System.out.println(getlist);
    			hasQuestionMains.addAll(getlist);
    		}
    
    	}
    	sumQuestionMains.addAll(noQuestionMains);
    	sumQuestionMains.addAll(hasQuestionMains);
    	return sumQuestionMains;	
    }

    拓展

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

    <span style="font-family:KaiTi_GB2312;">/
     * 
     */
    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<person style="box-sizing: border-box;"> personList){
    	if(personList == null){
    		return;
    	}
    
    	Map<String, List<person style="box-sizing: border-box;">> map = new HashMap<String, List<person style="box-sizing: border-box;">>();
    	for(Person person : personList){
    		String sex = person.getSex();
    		List<person style="box-sizing: border-box;"> persons = map.get(sex);
    		if(persons == null){//第一次加入
    			persons = new ArrayList<person style="box-sizing: border-box;">();
    		}
    
    		persons.add(person);
    		map.put(sex, persons);
    	}
    
    	for (Entry<String, List<person style="box-sizing: border-box;">> entry : map.entrySet()) {
    		String key = entry.getKey();
    		System.out.println(key + "	" + entry.getValue());
    	}
    }
    </person></person></person></person></person></person></span>

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

    <span style="font-family:KaiTi_GB2312;">import com.google.common.collect.ArrayListMultimap;
    import com.google.common.collect.Multimap;
    
    Multimap<K, V> myMultimap = ArrayListMultimap.create();</span>
    从名字可以看出,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实现上面同样的功能代码有点像

    <span style="font-family:KaiTi_GB2312;">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());
    }</span>
    看到了吧,代码简单多了吧!这里有一点你可能会疑惑,就是为何get方法返回的是一个Collection而不是list,这是因为前者会更加有用。如果你需要基于multimap直接操作list或者set,那么可以在定义类型的时候使用子类名称:ListMultimap,SetMultimap和SortedSetMultimap。例如:
    <span style="font-family:KaiTi_GB2312;">ListMutlimap<String,Person> myMutlimap = ArrayListMultimap.create();
    // Returns a List, not a Collection.
    List<Person> myValues = myMutlimap.get("myKey");</span>

    这里需要再次强调的是,Multimap不是Map(Multimap Is Not A Map)!

    一个Multimap<K, V>不是一个Map<K, Collection<V>>, 虽然我们可以利用Map<K, Collection<V>>来实现Multimap<K, V>,即使如此,它们之间还是有区别的:

    1. Multimap.get(key) 总是返回一个unll值(可能是一个空的collection);
    2. 可以利用asMap()方法来得到一个 Map<K, Collection<V>>类型的数据(或者利用ListMultimap中的静态方法Multimaps.asMap()得到一个Map<K, List<V>类型的数据; SetMultimap和SortedSetMultimap也类似);
    3. Multimap.containsKey(key)只有在这个key和一个或者多个元素相关联的时候才会返回true,如果这个key在删除之前和一个或者多个元素相关联则函数将会返回false;
    4. Multimap.entries()返回Multimap所有实体的所有key值;
    5. Multimap.size()返回在Multimap中存放的所有实体的数量,而不是不同keys的数量。我们可以利用Multimap.keySet().size()得到Multimap中所有不同keys的数量。
  • 相关阅读:
    业务、技术和语言的关系
    查询优化一般原则
    软件构架师的特点(转与Rational Edge)
    VMware安装Vista虚拟机
    使能更改SubVersion日志信息
    清除数据库日志文件
    构建自定义活动以扩展您的工作流的作用范围(转载于MSDN)
    Delphi数据库通用模块及典型系统开发
    Windows Workflow Foundation 2 规则引擎简介
    设置STS服务器配置数据库
  • 原文地址:https://www.cnblogs.com/tanqianqian/p/5975000.html
Copyright © 2020-2023  润新知