Java对象比较器对泛型List进行排序-Demo

针对形如:字段1    字段2     字段3       字段n

1       hello     26          7891       world     89          5562       what      55          4562       the       85          452       fuck      55          995       haha      98          455

以上类型的查询数据结果,需要对 字段3 进行求和分组(在SQL查询无法一次性完成的情况下,通常采用Java分组排序),大概思路如下:

1、在Bean中添加相关的分组标记字段,对求和或者其它统计的结果进行插入分组标记,下面demo中为bigIdOrder标记

2、对完成标记的List进行标记的补全

3、对补全的List按照标记进行排序

PS:非常不赞成在前端用JS/JQ等进行排序,非常费劲,并且数组还会发生不可知的变化,笔者吃过亏(算法高手除外),笔者编码水平有限,写的不到位的地方恳请大神们批评指正。

因编码直接来源于项目,变量名未做统一demo化,现给出提示:bigId:字段1pinci:字段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;
时间: 2024-10-20 18:31:28

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

我爱java系列---【java对象比较器,用于记录修改操作时修改的具体详情】

对象比较器 public class LogUtils<T> { /** * 对象比较器 * 比较结果eg:1.字段名称loginName,旧值:liu,新值:gu;2.字段名称address,旧值:hunan,新值:neimenggu * @param oldBean * @param newBean * @return */ public String compareObject(Object oldBean, Object newBean) { String str = "&q

java对象比较器和克隆

一.比较器Comparable和Comparator 上一篇博客介绍了工具类Arrays工具类 .我们可以对基本类型的数组调用Arrays.sort()函数来进行数组的排序.排序操作在日常开发中经常要使用到.那么String类和自定义类能不能使用Arrays.sort()来进行排序呢.下面我们来试试,如下: Java代码 publicclassMystring { publicstaticvoidmain(String[] args) { String []a={"早上","

【java对象比较器和克隆】

一.比较器Comparable和Comparator 上一篇博客介绍了工具类Arrays工具类.我们可以对基本类型的数组调用Arrays.sort()函数来进行数组的排序.排序操作在日常开发中经常要使用到.那么String类和自定义类能不能使用Arrays.sort()来进行排序呢.下面我们来试试,如下: public class Mystring { public static void main(String[] args) { String []a={"早上","中午&

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

JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术.该过程中,JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档.从另一方面来讲,JAXB提供了快速而简便的方法将XML模式绑定到Java表示,从而使得Java开发者在Java应用程序中能方便地结合XML数据和处理函数. 注解介绍        1)        @XmlType    

Java对象和XML的相互转换化

https://blog.csdn.net/u010331823/article/details/78258311 写在前面:Jaxb是JavaEE的规范.全称Java Architecture for XML Binding.  可以根据XML Schema产生Java类的技术.JAXB也提供了将XML实例文档反向生成Java对象树的方法,并能将Java对象树的内容重新写到XML实例文档.  JAXB 2.0是JDK 1.6的组成部分.JAXB 2.2.3是JDK 1.7的组成部分,在实际使用

JAVA笔记10__Math类、Random类、Arrays类/日期操作类/对象比较器/

/** * Math类.Random类.Arrays类:具体查JAVA手册...... */ public class Main { public static void main(String[] args) { String[] s1 = {"a","b","c","d","e"}; String[] s2 = {"a","b","c",&qu

利用Apache的commons-beanutils和commons-collections包实现Java对象的按属性排序

在日常工作中经常用到需要对java对象集合或者Map集合中的某个属性做排序,这个需求可以利用Apache的commons-beanutils和commons-collections包来实现,主要实现方式如下: public static <T> void sort(List<T> list, String property, boolean asc) { Comparator<?> comparator = ComparableComparator.getInstanc

Java对象排序小测试

import java.util.ArrayList; import java.util.Collections; import java.util.List; /**  * Java对象排序  */ public class User implements Comparable<User> {     private int idx;     public User(int idx) {         this.idx = idx;     }     public int getIdx(

黑马程序员——java——TreeSet集合中储存学生对象,按照其年龄进行排序

TreeSet集合中储存学生对象,按照其年龄进行排序 import java.util.Comparator; import java.util.HashSet; import java.util.Iterator; import java.util.LinkedHashSet; import java.util.TreeSet; public class SortListDemos { public static void main(String[] args) { // //linkhash