利用multimap给数据高效分类(1)
来源:互联网 发布:分水岭算法 过分割 编辑:程序博客网 时间:2024/06/11 13:27
背景:
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;}@Overridepublic 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 + "\t" + 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 + "\t" + 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>,即使如此,它们之间还是有区别的:
- Multimap.get(key) 总是返回一个unll值(可能是一个空的collection);
- 可以利用asMap()方法来得到一个 Map<K, Collection<V>>类型的数据(或者利用ListMultimap中的静态方法Multimaps.asMap()得到一个Map<K, List<V>类型的数据; SetMultimap和SortedSetMultimap也类似);
- Multimap.containsKey(key)只有在这个key和一个或者多个元素相关联的时候才会返回true,如果这个key在删除之前和一个或者多个元素相关联则函数将会返回false;
- Multimap.entries()返回Multimap所有实体的所有key值;
- Multimap.size()返回在Multimap中存放的所有实体的数量,而不是不同keys的数量。我们可以利用Multimap.keySet().size()得到Multimap中所有不同keys的数量。
1 0
- 利用multimap给数据高效分类(1)
- 14.如何给分类添加数据成员
- 利用BP神经网络分类iris数据集
- 利用DecisionTree对titanic数据进行分类
- 利用贝叶斯分类器对fetch_20newsgroups数据集进行分类
- 如何利用运行时给系统分类添加一个属性?
- iOS-利用运行时给分类添加属性
- iOS利用运行时给分类添加属性
- select2,利用ajax高效查询大数据列表(可搜索、可分页)
- Vue.js-----轻量高效的MVVM框架,组件利用Props传递数据)
- Vue.js-----轻量高效的MVVM框架(九、组件利用Props传递数据)
- 利用dataset将数据给到dataGridview
- (转)multimap容器
- multimap
- multimap
- Multimap
- multimap
- multimap
- 实时计算实践(spark streaming+kafka+hdfs)
- Toast总结一
- 搭建nghttp2.0作为apns服务的代理的相关问题总结
- 前端框架Avalon:简介
- 学生会竞选发言稿
- 利用multimap给数据高效分类(1)
- Bitmap压缩(二次采样)
- 【算法】给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数
- 页标题用SpringMVC 3和tiles2本土化
- Poj 2431 Expedition【优先队列+贪心】
- C#小程序实现闰年判断、月份的天数以及所属季度的判断
- poj3468 线段树
- 使用opnalpr训练目标检测级联分类器
- JZOJ4787. 【NOIP2016提高A组模拟9.17】数格子