Java对象比较器对泛型List进行排序-Demo
针对形如:
字段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的更多相关文章
- java对象比较器和克隆
一.比较器Comparable和Comparator 上一篇博客介绍了工具类Arrays工具类 .我们可以对基本类型的数组调用Arrays.sort()函数来进行数组的排序.排序操作在日常开发中经常要 ...
- JAXB实现java对象与xml之间转换
JAXB简介: 1.JAXB能够使用Jackson对JAXB注解的支持实现(jackson-module-jaxb-annotations),既方便生成XML,也方便生成JSON,这样一来可以更好的标 ...
- 总结学习! xml与java对象转换 --- JDK自带的JAXB(Java Architecture for XML Binding)
JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术.该过程中,JAXB也提供了将XML实例文档反向 ...
- Java比较器对数组,集合排序一
数组排序非常简单,有前辈们的各种排序算法,再加上Java中强大的数组辅助类Arrays与集合辅助类Collections,使得排序变得非常简单,如果说结合比较器Comparator接口和Collato ...
- JAVA笔记10__Math类、Random类、Arrays类/日期操作类/对象比较器/对象的克隆/二叉树
/** * Math类.Random类.Arrays类:具体查JAVA手册...... */ public class Main { public static void main(String[] ...
- Java如何操作对象(bean)进行动态排序?
原文出自:https://blog.csdn.net/seesun2012 简介如题:Java如何操作对象(bean)进行动态排序?Java实体类(bean)动态排序? 原理:利用反射根据指定的属性值 ...
- 如何使用 Java 对 List 中每个对象元素按时间顺序进行排序
如何使用 Java 对 List 中每个对象元素按时间顺序进行排序 Java 实现 import java.text.SimpleDateFormat; import java.util.ArrayL ...
- 第50节:Java的当中的泛型
Java当中的泛型 01 import java.util.ArrayList; import java.util.List; public class Demo{ public static voi ...
- Java的当中的泛型
Java当中的泛型 01 import java.util.ArrayList; import java.util.List; public class Demo{ public static voi ...
随机推荐
- oracle 解锁scott账户
安装oracle数据库的时候忘了解锁账户,再加上一直配置不成功,链接不上,最后终于配置好了,发现没账户可用,oracle好难. oracle版本是 Oracle Database 11g Enterp ...
- Data source rejected establishment of connection, message from server: "Too many connections"
错误叙述性说明: 測试一段时间没有不论什么问题.今天突然用户无法登录,报错如Data source rejected establishment of connection, message fro ...
- 概率图形模型(PGM)学习笔记(四)-贝叶斯网络-伯努利贝叶斯-贝叶斯多项式
之前忘记强调重要的差异:链式法则的条件概率和贝叶斯网络的链式法则之间的差异 条件概率链式法则 P\left({D,I,G,S,L} \right) = P\left( D \right)P\left( ...
- 设计模式16:迭代模式(Iterator)
迭代模式: 它提供了一种方法没有对象的顺序访问聚合对象的暴漏底层的细节. Provide a way to access the elements of an aggregate object seq ...
- 【SSH 基金会】SSH框架--struts进一步的详细解释(两)
继上篇博客 既然我们知道了不使用struts给我们带来这么多弊端,那么以下我们来看看struts是怎样封装的.怎么解决我们出现的问题的? 先来说一下struts的基本流程,帮助大家理解以下的代码: S ...
- Matlab与.NET混合编程解决人脸识别问题
原文:[原创]Matlab与.NET混合编程解决人脸识别问题 如果这些文章对你有用,有帮助,期待更多开源组件介绍,请不要吝啬手中的鼠标. [原创分享]Matlab.NET混编调用Figure窗体 ht ...
- Android FM学习中的模块 FM启动过程
最近的研究FM模,FM是一家值我正在学习模块.什么可以从上层中可以看出. 上层是FM按钮的操作和界面显示,因此调用到FM来实现广播收听的功能. 看看Fm启动流程:例如以下图: 先进入FMRadio.j ...
- 组合数处理(逆元求解)...Orz
网上发现了不错的博客讲解... 熊猫的板子:http://blog.csdn.net/qq_32734731/article/details/51484729 组合数的预处理(费马小定理|杨辉三角|卢 ...
- 20天android学习
20多天的实习(事实上,一个人学习的东西)要结束, 其余的都只有读研. 此20许多天,我学到了很多东西, 至android的发展也有一定的了解.之后写这篇文章主要是完成研究可以学得很快再次回升 1.安 ...
- 关于通过id查询记录的一些总结
最近在做一个oa系统,简化了账号的设置,列名均为id,类型均为varchar:有的表将id设置成了主键,有的表没有设置成主键. 通过举例说明通过id查询的一些问题. 之前登陆的时候,账号001-007 ...