关于java sort的几种实现方式(单纯排序,按照bean的某一个字段,按照bean的多个字段)
最近的开发过程中遇到了,按照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的多个字段)的更多相关文章
- Java多线程的三种实现方式
java多线程的三种实现方式 一.继承Thread类 二.实现Runnable接口 三.使用ExecutorService, Callable, Future 无论是通过继承Thread类还是实现Ru ...
- java多线程的几种实现方式
java多线程的几种实现方式 1.继承Thread类,重写run方法2.实现Runnable接口,重写run方法,实现Runnable接口的实现类的实例对象作为Thread构造函数的target3.通 ...
- java 代理的三种实现方式
Java 代理模式有如下几种实现方式: 1.静态代理. 2.JDK动态代理. 3.CGLIB动态代理. 示例,有一个打招呼的接口.分别有两个实现,说hello,和握手.代码如下. 接口: public ...
- Java 定时任务的几种实现方式
JAVA实现定时任务的几种方式 @(JAVA)[spring|quartz|定时器] 近期项目开发中需要动态的添加定时任务,比如在某个活动结束时,自动生成获奖名单,导出excel等,此类任务由于活动 ...
- Java多线程的两种实现方式
Java总共有两种方式实现多线程 方式1:通过继承Thread类的方式 package com.day04; /** * 通过继承Thread类并复写run方法来是实现多线程 * * @author ...
- XML基础+Java解析XML +几种解析方式的性能比较
XML基础+Java解析XML 一:XML基础 XML是什么: 可扩展的标记语言 XML能干什么: 描述数据.存储数据.传输(交换)数据. XML与HTML区别: 目的不一样 XML 被设计用来描述数 ...
- 阿里巴巴--java多线程的两种实现方式,以及二者的区别
阿里巴巴面试的时候,昨天问了我java面试的时候实现java多线程的两种方式,以及二者的区别当时只回答了实现线程的两种方式,但是没有回答上二者的区别: java实现多线程有两种方式: 1.继承Thre ...
- java的list几种实现方式的效率(ArrayList、LinkedList、Vector、Stack),以及 java时间戳的三种获取方式比较
一.list简介 List列表类,顺序存储任何对象(顺序不变),可重复. List是继承于Collection的接口,不能实例化.实例化可以用: ArrayList(实现动态数组),查询快(随意访问或 ...
- Java定时器的三种实现方式
一.普通thread /** * 普通thread * 这是最常见的,创建一个thread,然后让它在while循环里一直运行着, * 通过sleep方法来达到定时任务的效果.这样可以快速简单的实现, ...
随机推荐
- boost之词法解析器spirit
摘要:解析器就是编译原理中的语言的词法分析器,可以按照文法规则提取字符或者单词.功能:接受扫描器的输入,并根据语法规则对输入流进行匹配,匹配成功后执行语义动作,进行输入数据的处理. C++ 程序员需要 ...
- 过河(DP)
问题描述] 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成 ...
- brbustoj 1818 石子合并问题--直线版
比较经典且基础的区间dp,转移方程为 dp_max[i][j] = max(dp_max[i][j],dp_max[i][k] + dp_max[k+1][j] + sum[j]-sum[i-1]); ...
- Oracle教程-查询(二)
emp 雇员表字段名称 数据类型 是否为空 备注-------- ----------- -------- --------EMPNO NUMBER(4) ...
- NAVICAT 拒绝链接的问题
处理步骤 1.先在原有的建一个新的用户 2.成功后,再点击原有的,即可使用
- h2database.com 高级特性
http://www.h2database.com/html/advanced.html http://www.h2database.com/html/features.html
- java socket 多线程网络传输多个文件
http://blog.csdn.net/njchenyi/article/details/9072845 java socket 多线程网络传输多个文件 2013-06-10 21:26 3596人 ...
- 浏览器加载外部js 的顺序,以及处理顺序。
问题, 有事候按F12打开 google的调试台后,查看network下面加载过来的资源是, 有些资源的状态处于 pending.. 个人理解: 浏览器是可以同时开启多个http 请求去加载外部的资源 ...
- 打印等腰三角形javascript
<html> <head> <script type="text/javascript"> var n=4;//层数 for(var i=1; ...
- mssql数据库syscolumns表中xtype列
xtype 类型34 image35 text36 uniqueidentifier48 tinyint52 smallint56 int58 smalldatetime59 real60 mo ...