针对形如:
字段1 字段2 字段3 字段n 1 hello 26 789
1 world 89 556
2 what 55 456
2 the 85 45
2 fuck 55 99
5 haha 98 455 以上类型的查询数据结果,需要对 字段3 进行求和分组(在SQL查询无法一次性完成的情况下,通常采用Java分组排序),大概思路如下: 1、在Bean中添加相关的分组标记字段,对求和或者其它统计的结果进行插入分组标记,下面demo中为bigIdOrder标记 2、对完成标记的List进行标记的补全 3、对补全的List按照标记进行排序 PS:非常不赞成在前端用JS/JQ等进行排序,非常费劲,并且数组还会发生不可知的变化,笔者吃过亏(算法高手除外),笔者编码水平有限,写的不到位的地方恳请大神们批评指正。 因编码直接来源于项目,变量名未做统一demo化,现给出提示:
bigId:字段1
pinci:字段3
bigIdOrder:标记字段(可自定义)

        JSONObject json = new JSONObject();
String dataType = request.getParameter("dataType");
String channelId = request.getParameter("channelId");
String order = request.getParameter("type");
setMapTimeRight(dataType, 0); map.put("channelId", channelId);
map.put("order", order); try {
List<UnconventionBrandAnalyseByBrand> now = this.service
.unconventionBrandSituation(map); //1、产生组装排序条件字段数据标记
int bigIdOrder=0;
int i=-1;
int i2=0;
List bigIdOrderArray = new ArrayList(); for(UnconventionBrandAnalyseByBrand un : now){
i++;
//如果当前bigId与前一个bigId相等,则将该id视为一个id(bigIdOrder),对该id所对应的所有频次数进行累加
if(i==0
&&now.get(0).getBigId().equals(now.get(1).getBigId())){
//第一次计数后有(非分组条件)
bigIdOrder = bigIdOrder+Integer.parseInt(now.get(i).getPinci());
}else if(i>0
&&i<now.size()-1
&&!now.get(i).getBigId().equals(now.get(i-1).getBigId())
&&now.get(i).getBigId().equals(now.get(i+1).getBigId())){
//前不同后相同(非分组条件)
bigIdOrder = bigIdOrder+Integer.parseInt(now.get(i).getPinci());
}else if(i>0
&&i<now.size()-1
&&now.get(i).getBigId().equals(now.get(i+1).getBigId())
&&now.get(i).getBigId().equals(now.get(i+1).getBigId())){
//前相同后相同(非分组条件)
bigIdOrder = bigIdOrder+Integer.parseInt(now.get(i).getPinci());
}else{
//分组条件
bigIdOrder = bigIdOrder+Integer.parseInt(now.get(i).getPinci()); un.setBigIdOrder(bigIdOrder+"");//添加分组标识(int类型bigIdOrder) bigIdOrderArray.add(i2, bigIdOrder+""); i2++;
bigIdOrder = 0;
}
} // 2、补全产生组装排序条件字段数据标记
int ii = 0;
int ng = 0;// 非分组条件计数器
for (UnconventionBrandAnalyseByBrand un : now) {
// 如果当前bigId与前一个bigId相等,则将该id视为一个id(bigIdOrder),对该id所对应的所有频次数进行累加 if (ii == 0
&& !now.get(0).getBigId().equals(now.get(1).getBigId())) {
// 第一次计数后无(分组条件)
} else if (ii > 0
&& i < now.size() - 1
&& now.get(ii).getBigId().equals(
now.get(ii - 1).getBigId())
&& !now.get(ii).getBigId().equals(
now.get(ii + 1).getBigId())) {
// 前同后不同(分组条件)
} else if (ii == now.size() - 1
&& now.get(ii).getBigId().equals(
now.get(ii - 1).getBigId())) {
// 后无前同(分组条件)
} else if (ii == now.size() - 1
&& !now.get(ii).getBigId().equals(
now.get(ii - 1).getBigId())) {
// 后无前不同(分组条件)
} else {
// 非分组条件
if (ii == 0) {
un.setBigIdOrder(bigIdOrderArray.get(0).toString());
} else if (!now.get(ii).getBigId().equals(
now.get(ii - 1).getBigId())) {
ng++;
un.setBigIdOrder(bigIdOrderArray.get(ng).toString()); } else {
un.setBigIdOrder(bigIdOrderArray.get(ng).toString());
}
}
ii++;
} // 3、开始排序采用对象比较器
Comparator<UnconventionBrandAnalyseByBrand> comparator = new Comparator<UnconventionBrandAnalyseByBrand>() {
public int compare(UnconventionBrandAnalyseByBrand s1,
UnconventionBrandAnalyseByBrand s2) {
// 排序标记
int ret = 0;
if (s1.getBigIdOrder() != s2.getBigIdOrder()) {
ret = Integer.parseInt(s1.getBigIdOrder())
- Integer.parseInt(s2.getBigIdOrder());
}
return ret > 0 ? -1 : 1;// 升序或者降序改变-1和1的位置即可
} }; //开始自动排序
Collections.sort(now,comparator); json.put("data", now); try {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter(); out.print(json);
out.close();
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
return null;

Java对象比较器对泛型List进行排序-Demo的更多相关文章

  1. java对象比较器和克隆

    一.比较器Comparable和Comparator 上一篇博客介绍了工具类Arrays工具类 .我们可以对基本类型的数组调用Arrays.sort()函数来进行数组的排序.排序操作在日常开发中经常要 ...

  2. JAXB实现java对象与xml之间转换

    JAXB简介: 1.JAXB能够使用Jackson对JAXB注解的支持实现(jackson-module-jaxb-annotations),既方便生成XML,也方便生成JSON,这样一来可以更好的标 ...

  3. 总结学习! xml与java对象转换 --- JDK自带的JAXB(Java Architecture for XML Binding)

    JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术.该过程中,JAXB也提供了将XML实例文档反向 ...

  4. Java比较器对数组,集合排序一

    数组排序非常简单,有前辈们的各种排序算法,再加上Java中强大的数组辅助类Arrays与集合辅助类Collections,使得排序变得非常简单,如果说结合比较器Comparator接口和Collato ...

  5. JAVA笔记10__Math类、Random类、Arrays类/日期操作类/对象比较器/对象的克隆/二叉树

    /** * Math类.Random类.Arrays类:具体查JAVA手册...... */ public class Main { public static void main(String[] ...

  6. Java如何操作对象(bean)进行动态排序?

    原文出自:https://blog.csdn.net/seesun2012 简介如题:Java如何操作对象(bean)进行动态排序?Java实体类(bean)动态排序? 原理:利用反射根据指定的属性值 ...

  7. 如何使用 Java 对 List 中每个对象元素按时间顺序进行排序

    如何使用 Java 对 List 中每个对象元素按时间顺序进行排序 Java 实现 import java.text.SimpleDateFormat; import java.util.ArrayL ...

  8. 第50节:Java的当中的泛型

    Java当中的泛型 01 import java.util.ArrayList; import java.util.List; public class Demo{ public static voi ...

  9. Java的当中的泛型

    Java当中的泛型 01 import java.util.ArrayList; import java.util.List; public class Demo{ public static voi ...

随机推荐

  1. ZOJ 3820 Building Fire Stations

    题意: 树上找两个点  使得其它点到这两点随意一点的距离的最大值最小 思路: 最大值最小  想到二分  在二分的基础上判定这个最大值是否可能 怎样判定这个问题就是怎样选那两个点的问题  非常明显  我 ...

  2. Cocos2d-x 3.2 Lua演示样本CocosDenshionTest(音频测试)

    Cocos2d-x 3.2 Lua演示样本CocosDenshionTest(音频测试)  本篇博客介绍Cocos2d-x 3.2中Lua演示样例的音频測试.Cocos2d-x使用SimpleAudi ...

  3. WCF分布式事务(EF)

    才说分布式事务,首先,了解一下什么是交易. 事务有四个特性:ACID A是Atomicity,原子性.一个事务往往涉及到很多的子操作,原子性则保证这些子操作要么都做,要么都不做,而不至于出现事务的部分 ...

  4. HDU 4300 Clairewd’s message(扩展KMP)

    思路:extend[i]表示原串以第i開始与模式串的前缀的最长匹配.经过O(n)的枚举,我们能够得到,若extend[i]+i=len且i>=extend[i]时,表示t即为该点之前的串,c即为 ...

  5. USACO maze1 BFS

    不写了很长的时间bfs该,很长一段时间的中间失误,当延期一次延伸成功的新节点的节点应该被标记为参观.否则,在某些情况下无限期延长队列. 输入一个小坑爹处理称号,能够进来当字符串被读取.然后用周围的墙上 ...

  6. Ajax基础知识(一)

    随便在百度谷歌上输入Ajax都会出现一大堆的搜索结果,这已经不再是什么新奇的技术了.但若从一开始就学习了ASP.Net,使用功能齐全的Visual Studio集成开发工具,或许未必能对访问一个动态网 ...

  7. Java设计模式菜鸟系列(十三)建模和实现状态模式

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39829859 状态模式(State):同意对象在内部状态改变时改变它的行为,对象看起来好像 ...

  8. 用Unicode迎接未来

         项目中使用了emoji,然后,问题产生了,后端MySQL数据库无法存储emoji字符,悲了个剧.      emoji是Unicode字符集的子集,Unicode的使用应该非常普遍了,怎么会 ...

  9. Linux内核分析(一)---linux体系简介|内核源码简介|内核配置编译安装

    原文:Linux内核分析(一)---linux体系简介|内核源码简介|内核配置编译安装 Linux内核分析(一) 从本篇博文开始我将对linux内核进行学习和分析,整个过程必将十分艰辛,但我会坚持到底 ...

  10. 页面加速Chromium 预压 Prerendering

    前者已经推出了一个博客prefetch预加载的网页资源,以提高网页加载速度,下面我们一起来看一下,以加速网页chromium prerendering.介绍prerendering之前.先介绍两个概念 ...