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 ...
随机推荐
- android 实现悬架控制
实现桌面View 如桌面歌词 1)将要显示在桌面的view,通过WindowManager.addView.挂在到WindowManager下;注意,WindowManager对象 ...
- 读改善c#代码157个建议:建议10~12
目录: 建议10:创建对象时需要考虑是否实现比较器 建议11:区别对待==与Equals 建议12:重写Equals时也要重写GetHashCode 一.建议10:创建对象时需要考虑是否实现比较器 比 ...
- MySQL之终端(Terminal)管理MySQL
原文:MySQL之终端(Terminal)管理MySQL 前言:MySQL有很多的可视化管理工具,比如“mysql-workbench”和“sequel-pro-”. 现在我写MySQL的终端命令操作 ...
- Bootstrap(2)整体架构
Bootstrap(2)整体架构 大多数Bootstrap的使用者都认为Bootstrap只提供了CSS组件 和JavaScript插件,其实CSS组件和JavaScript插件只是Bootstrap ...
- 手游client思考框架
手游新公司新项目client我不太同意框架.虽然我也终于让步,当他居然问老板,使这个幼稚的行为而悔恨. 然而,就在最近我写了一些代码视图,我更坚定了自己的想法和思想.和思路不一定适合其它人,所以我并不 ...
- HTTP Cookie深入理解
HTTP Cookie 概述:Cookie通常也叫做网站cookie,浏览器cookie或者http cookie,是保存在用户浏览器端的,并在发出http请求时会默认携带的一段文本片段.它可以用来做 ...
- TortoiseGit安装与配置(转)
TortoiseGit 简称 tgit, 中文名海龟Git. 海龟Git只支持神器 Windows 系统, 有一个前辈海龟SVN, TortoiseSVN和TortoiseGit都是非常优秀的开源的版 ...
- 第7章 桥接模式(Bridge Pattern)
原文 第7章 桥接模式(Bridge Pattern) 定义: 在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能 ...
- C# 使用 Code Snippet 简化 Coding
在开发的项目的时候,你是否经常遇到需要重复编写一些类似的代码,比如是否经常会使用 for.foreach ? 在编写这两个循环语句的时候,你是一个字符一个字符敲还是使用 Visual Studio 提 ...
- OS和android游戏纹理优化和内存优化(cocos2d-x)
注:原文地址不详! 1.2d游戏最占内存的无疑是图片资源. 2.cocos2d-x不同平台读取纹理的机制不同. ios以下使用CGImage,android和windows下是直接调用png库.我測试 ...