zoukankan      html  css  js  c++  java
  • 利用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的数量。
  • 相关阅读:
    Java+7入门经典 -1 简介
    优化算法动画演示Alec Radford's animations for optimization algorithms
    如何写科技论文How to write a technical paper
    开始学习深度学习和循环神经网络Some starting points for deep learning and RNNs
    用500行Julia代码开始深度学习之旅 Beginning deep learning with 500 lines of Julia
    用10张图来看机器学习Machine learning in 10 pictures
    ICLR 2013 International Conference on Learning Representations深度学习论文papers
    ICLR 2014 International Conference on Learning Representations深度学习论文papers
    卷积神经网络CNN(Convolutional Neural Networks)没有原理只有实现
    卷积神经网络Convolutional Neural Networks
  • 原文地址:https://www.cnblogs.com/tanqianqian/p/5975000.html
Copyright © 2011-2022 走看看