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 ...
随机推荐
- iOS_38_手势
Pan平移手势 终于效果图: Swipe轻扫手势 LongPress长按手势 Pinch和Rotation手势 捏合(缩放)和旋转 终于效果图: 涂鸦 终于效果图: 事件分3大类:触摸.加速计.远程遥 ...
- HDU 3874 离线段树
在所有数字的统计范围,,对于重复统计只有一次 离线段树算法 排序终点坐标.然后再扫,反复交锋.把之前插入树行被删除 #include "stdio.h" #include &quo ...
- Git现实(一个)版本控制概述
从今天开始.我们了解的分布式版本控制系统Git相关内容.了解Git之前,我们的第一个版本控制系统,使宏观的描述. 什么是版本号控制 版本号控制是指通过对文件内容的变化进行记录,并为每次的变化进行编号, ...
- 一张漫画说尽IT开发过程
- schema for clojure
Schema for Clojure Data Shape Declaration and Validation 1.何为schema schema是描写叙述数据形式的一种clojure数据结构,可用 ...
- 谈话ZooKeeper(一个)分析ZooKeeper的Quorums机制--预防Split-Brain问题
使用ZooKeeper学生们应该看到一个参数.它是ZooKeeper超过一半的群集必须节点(Majority)可用的.外来人才在整个集群中可用.在大多数情况下,这种说法是正确的. 谈论这篇文章背后的原 ...
- Linux解析内核源代码——传输控制块诞生
原创文章是freas_1990,转载请注明出处:http://blog.csdn.net/freas_1990/article/details/23795587 在Linux 2.6一旦(不包含2.6 ...
- android 推断应用程序是系统程序还是用户程序
直接上代码: AppInfo.java <span style="font-size:18px;">package com.example.packages; publ ...
- 有效的XML: DTD(文档类型定义)介绍(转)
文档类型定义和命名空间 有效(Valid)的XML文档: 首先,XML文档是个格式正规的(Well-formed)XML文档:(见格式正规的XML:语法 属性 实体 处理指令 样式单 CDATA节). ...
- jquery选择器中逗号的使用
1.多条件选择器 多条件选择器:$("p,div,span.menuitem"),同时选择p标签,div标签,和拥有menuitem样式的span标签元素 <table id ...