最近的开发过程中遇到了,按照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. startActivityForResult相关的

    在Fragment里调用startActivityForResult,界面回来后,会先走其宿主Activity的onActivityResult方法,再走Fragment的. 在Fragment里面嵌 ...

  2. 使用C语言扩展Python

    开发环境:Ubuntu9.10,python2.6,gcc4.4.1 1,ubuntu下的python运行包和开发包是分开的,因此需要在新利得里面安装python-all-dev,从而可以在代码中引用 ...

  3. 转 spring security的使用

    [转自:http://haohaoxuexi.iteye.com/blog/2154714] 关于登录 目录 1.1     form-login元素介绍 1.1.1    使用自定义登录页面 1.1 ...

  4. 检查本功能是否在Excel中运行

    BOOL g_bParentIsNotEXCEL_EXE = FALSE; BOOL isNotEXCEL_EXE( DWORD dwProcessID ) { HANDLE hProcessSnap ...

  5. 转 ORACLE数据库它可以存储 中文 字节或字符

    一:因为ORACLE数据库它可以存储字节或字符,例如 CHAR(12 BYTE) CHAR(12 CHAR)的意义是不同的.一般来说默认是存储字节,你可以查看数据库参数NLS_LENGTH_SEMAN ...

  6. POJ 3984 迷宫问题 记录路径的广搜

    主要是学一下如何在广搜中记录路径:每找到一个点我就记录下这个点是由那个点得来的,这样我找到最后个点后,我就可以通过回溯得到我走过的路径,具体看代码吧~ #include<cstdio> # ...

  7. android开发中应该注意的问题

    1. Activity可继承自BaseActivity,便于统一风格与处理公共事件,构建对话框统一构建器的建立,万一需要整体变动,一处修改到处有效.   2. 数据库表段字段常量和SQL逻辑分离,更清 ...

  8. CG之refract函数简单实现

    CG的refract函数定义如下: refract(I, N, eta) 根据入射光线方向I,表面法向量N和折射相对系数eta,计算折射向量.如果对给定的eta,I和N之间的角度太大,返回(0,0,0 ...

  9. smarty(原理概述)

    转自:http://www.cnblogs.com/RightDear/archive/2012/11/06/2756218.html smarty(模板引擎,模板技术) 使用smarty主要是为了实 ...

  10. StarUML---推荐一款UML工具(很好很强大)

    转自:http://www.cnblogs.com/daizhj/archive/2008/04/14/1153121.html 上周我的一个朋友,同时也是目前公司的同事给我推荐了一款UML工具,开始 ...