最近的开发过程中遇到了,按照bean类中的多个字段进行排序的情况,借此机会把相关的排序做法,简单整理备份一下。

1.list的单纯排序

2.list元素为bean的情况,按照bean的某一个属性进行排序

3.list元素为bean的情况,按照bean的多个属性进行排序

import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map; import cn.com.ydd.bean.SortBean;
import cn.com.ydd.util.CommonUtil; public class SortTest {
public static void main(String[] args) { //1、単純なリストをソートする例
ArrayList lst = new ArrayList();
lst.add("00000000001");
lst.add("00000000002");
lst.add("00000000003");
lst.add("00000000004");
lst.add("00000000005");
//単純なリストをソートする例(昇順)
Collections.sort(lst);
System.out.println(lst.toString());
//単純なリストをソートする例(降順)
Collections.reverse(lst);
System.out.println(lst.toString());
//2、LISTに持っているbeanのある属性をキーとしてソートする例
List<SortBean> list = new ArrayList<SortBean>();
SortBean sb;
sb = new SortBean();
sb.setId("00001");
sb.setName("田中");
sb.setSex("F");
list.add(sb); sb = new SortBean();
sb.setId("00002");
sb.setName("佐藤");
sb.setSex("M");
list.add(sb); sb = new SortBean();
sb.setId("00003");
sb.setName("佐藤");
sb.setSex("M");
list.add(sb); sb = new SortBean();
sb.setId("00004");
sb.setName("佐藤");
sb.setSex("M");
list.add(sb); sb = new SortBean();
sb.setId("00005");
sb.setName("山本");
sb.setSex("F");
list.add(sb); sb = new SortBean();
sb.setId("00006");
sb.setName("山本");
sb.setSex("F");
list.add(sb); //降順
System.out.println("***********name:降順*************");
CommonUtil.sort(list, "name", false);
for(SortBean item : list){
System.out.print(item.getId()+" ");
System.out.print(item.getName()+" ");
System.out.println(item.getSex());
}
//昇順
System.out.println("***********name:昇順*************");
CommonUtil.sort(list, "name", true);
for(SortBean item : list){
System.out.print(item.getId()+" ");
System.out.print(item.getName()+" ");
System.out.println(item.getSex());
} System.out.println("***********name:昇順 ID:降順*************");
//3、LISTに持っているbeanの複数属性をキーとしてソートする例
Map<String, String> sortParam = new LinkedHashMap<String, String>();
//name:昇順 ID:降順
sortParam.put("name", "asc");
sortParam.put("id", "desc");
CommonUtil.sortExecute(list, sortParam); for(SortBean item : list){
System.out.print(item.getId()+" ");
System.out.print(item.getName()+" ");
System.out.println(item.getSex());
}
sortParam.clear();
//name:昇順 ID:昇順
sortParam.put("name", "desc");
sortParam.put("id", "asc");
CommonUtil.sortExecute(list, sortParam);
System.out.println("***********name:降順 ID:昇順*************");
for(SortBean item : list){
System.out.print(item.getId()+" ");
System.out.print(item.getName()+" ");
System.out.println(item.getSex());
}
}
}

共通方法类

import java.util.Comparator;
import java.util.List;
import java.util.Map; import org.apache.commons.beanutils.BeanComparator;
import org.apache.commons.collections4.ComparatorUtils;
import org.apache.commons.collections4.comparators.ComparableComparator;
import org.apache.commons.collections4.comparators.ComparatorChain;
import org.apache.commons.collections4.comparators.NullComparator; public class CommonUtil { /**
* beanのある属性によってソートする場合
* @param list
* @param filedName
* @param ascFlag
*/
@SuppressWarnings("unchecked")
public static void sort(List list, String filedName, boolean ascFlag) { if (list.size() == 0 || filedName.equals("")) {
return;
}
Comparator<?> cmp = ComparableComparator.INSTANCE;
// 降順の場合
if (ascFlag) {
cmp = ComparatorUtils.nullLowComparator(cmp);
} else {
cmp = ComparatorUtils.reversedComparator(cmp); }
Collections.sort(list, new BeanComparator(filedName, cmp));
} /**
* beanのある属性によってソートする場合
* @param beans
* @param sortParam
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public static void sortExecute(List<?> beans, Map<String, String> sortParam) { // 検索結果リスト対象またはソースパラメータ対象がNULLである場合
if (beans.size() == 0 || sortParam.keySet().size() == 0) {
// 処理終了
return;
} // 検索結果リスト対象またはソースパラメータ対象のサイズがゼロ件の場合
if (beans.isEmpty() || sortParam.isEmpty()) {
// 処理終了
return;
}
ComparatorChain comparator = new ComparatorChain();
boolean sortMethod = false;
for (String itemName : sortParam.keySet()) {
sortMethod = false;
if ("desc".equals(sortParam.get(itemName))) {
sortMethod = true;
}
comparator.addComparator(new BeanComparator(itemName, new NullComparator()), sortMethod);
}
Collections.sort(beans, comparator);
} }

输出结果

[00000000001, 00000000002, 00000000003, 00000000004, 00000000005]
[00000000005, 00000000004, 00000000003, 00000000002, 00000000001]
***********name:降順*************
00001 田中 F
00005 山本 F
00006 山本 F
00002 佐藤 M
00003 佐藤 M
00004 佐藤 M
***********name:昇順*************
00002 佐藤 M
00003 佐藤 M
00004 佐藤 M
00005 山本 F
00006 山本 F
00001 田中 F
***********name:昇順 ID:降順*************
00004 佐藤 M
00003 佐藤 M
00002 佐藤 M
00006 山本 F
00005 山本 F
00001 田中 F
***********name:降順 ID:昇順*************
00001 田中 F
00005 山本 F
00006 山本 F
00002 佐藤 M
00003 佐藤 M
00004 佐藤 M

关于java sort的几种实现方式(单纯排序,按照bean的某一个字段,按照bean的多个字段)的更多相关文章

  1. Java多线程的三种实现方式

    java多线程的三种实现方式 一.继承Thread类 二.实现Runnable接口 三.使用ExecutorService, Callable, Future 无论是通过继承Thread类还是实现Ru ...

  2. java多线程的几种实现方式

    java多线程的几种实现方式 1.继承Thread类,重写run方法2.实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target3.通 ...

  3. java 代理的三种实现方式

    Java 代理模式有如下几种实现方式: 1.静态代理. 2.JDK动态代理. 3.CGLIB动态代理. 示例,有一个打招呼的接口.分别有两个实现,说hello,和握手.代码如下. 接口: public ...

  4. Java 定时任务的几种实现方式

    JAVA实现定时任务的几种方式 @(JAVA)[spring|quartz|定时器]  近期项目开发中需要动态的添加定时任务,比如在某个活动结束时,自动生成获奖名单,导出excel等,此类任务由于活动 ...

  5. Java多线程的两种实现方式

    Java总共有两种方式实现多线程 方式1:通过继承Thread类的方式 package com.day04; /** * 通过继承Thread类并复写run方法来是实现多线程 * * @author ...

  6. XML基础+Java解析XML +几种解析方式的性能比较

    XML基础+Java解析XML 一:XML基础 XML是什么: 可扩展的标记语言 XML能干什么: 描述数据.存储数据.传输(交换)数据. XML与HTML区别: 目的不一样 XML 被设计用来描述数 ...

  7. 阿里巴巴--java多线程的两种实现方式,以及二者的区别

    阿里巴巴面试的时候,昨天问了我java面试的时候实现java多线程的两种方式,以及二者的区别当时只回答了实现线程的两种方式,但是没有回答上二者的区别: java实现多线程有两种方式: 1.继承Thre ...

  8. java的list几种实现方式的效率(ArrayList、LinkedList、Vector、Stack),以及 java时间戳的三种获取方式比较

    一.list简介 List列表类,顺序存储任何对象(顺序不变),可重复. List是继承于Collection的接口,不能实例化.实例化可以用: ArrayList(实现动态数组),查询快(随意访问或 ...

  9. Java定时器的三种实现方式

    一.普通thread /** * 普通thread * 这是最常见的,创建一个thread,然后让它在while循环里一直运行着, * 通过sleep方法来达到定时任务的效果.这样可以快速简单的实现, ...

随机推荐

  1. Ubuntu14.04下SP_Flash_Tool_exe_Linux无法烧录

    1,用命令lsusb查看usb信息. 2,vim 20-mm-blacklist-mtk.rules 输入下面内容: ATTRS{idVendor}=="0e8d",ENV{ID_ ...

  2. windows下,emacs的配置文件在哪儿?

    配置文件_Emacs在你的家目录下"C:/Documents and Settings/username/Application Data". 在Window 7下,配置文件目录在 ...

  3. C# 经典入门12章-使用泛型-1

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA8sAAAK5CAIAAAAHDiuGAAAgAElEQVR4nOyd9V9Uzfv/v3/J0t0N0p

  4. PHP 命名空间以及自动加载(自动调用的函数,来include文件)

    这篇文章的目的是记录 1. php中的自动加载函数 __autoload(), 和 spl_autoload_register()函数, 2 .php中命名空间的使用. 一.当不使用命名空间的时候 a ...

  5. ant语法和规范

    一.前言: 以前在做JavaEE项目的时候曾经听说过这个名字,但是由于没有用到,所以也没有去学习.最近在研究Android打包的时候,看了下build.xml文件,甚是迷糊,于是学习一下,稍有心得. ...

  6. MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准

    http://www.alixixi.com/program/a/2010080364045.shtml MIME 消息能包含文本.图像.音频.视频以及其他应用程序专用的数据. 官方的 MIME 信息 ...

  7. 多文件上传插件Stream,是Uploadify的Flash版和Html5版的结合,带进度条,并支持html5断点续传(附件上传),拖拽等功能

    是根据某网的文件上传插件加工而来,支持不同平台(Windows, Linux, Mac, Android, iOS)下,主流浏览器(IE7+, Chrome, Firefox, Safari, 其他) ...

  8. Fragmen和Activity之间的通信--接口和实现的分离(转)

    Fragmen和Activity之间的通信--接口和实现的分离(转) 分类: Android平台     在平板的开发过程中通常都会采用多个Fragment的实现方式,通常有一个为list的Fragm ...

  9. CodeForces 76E Points

    给出n个点,求任意两点间距离的平方和. 暴力显然超时,可以把公式写出来,化简一下,发现预处理一下后缀和就可以o(n)出解了. #include<cstdio> #include<cs ...

  10. cookie讲解-------浏览器种cookie

    1  responce添加Set-Cookie参数: http request的返回responce为: [('Content-Type', 'application/x-javascript'), ...