关于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方法来达到定时任务的效果.这样可以快速简单的实现, ...
随机推荐
- linux下如何修改iptables开启80端口
linux下如何修改iptables开启80端口 最近在做本地服务器的环境,发现网站localhost能正常访问,用ip访问就访问不了,经常使用CentOS的朋友,可能会遇到和我一样的问题.开启了 ...
- LNMPA by lin
CentOS系统下执行:wget -c http://soft.vpser.net/lnmp/lnmp1.1-full.tar.gz && tar zxf lnmp1.1-full.t ...
- 困扰你的private static final long serialVersionUID
很多时候一个新手在写代码的时候,往往你的IDE就会告诉你一个警告 然后你点击处理这个警告之后,它就会默认给你的类生成一个 private static final long serialVersion ...
- (一)、Struts第一天
(一).Struts第一天 1. JavaWeb知识回顾 n 客户端编程 HTLM/CSS/JS n XML技术 会写XML * 基本语法 * DTD * Schema 会读XML * Dom4J读取 ...
- Java实现随意切换VPN改变上网地区
http://www.jb51.net/article/69267.htm 这篇文章主要介绍了Java实现随意切换VPN改变上网地区,本文直接给出实例代码,需要的朋友可以参考下 在很多情况下,有些网络 ...
- C#入门经典第四章-流程控制-1
布尔类型:
- FCKeditor 2.6.6在ASP中的安装及配置方法分享--ZZ转载自网络
FCKeditor目前的最新版本是2.6.6,在网上搜索此版本的配置方法,发现很少有asp的配置方法,以下就把自己的一些配置经验分享给有需要的你. 首先从FCKEditor官方下载最新的版本脚本之 ...
- HDU 1260 Tickets(基础dp)
一开始我对这个题的题意理解有问题,居然超时了,我以为是区间dp,没想到是个水dp,我泪奔了.... #include<stdio.h> #include<string.h> # ...
- HDU 2188 悼念512汶川大地震遇难同胞——选拔志愿者(基础巴什博奕)
最最最基础巴什博奕 #include<stdio.h> #include<iostream> #include<cstring> #include<cmath ...
- Express静态服务器
做应用的时候,如果需要给人测试,需要搭建本地服务器: 下载apache tomcat,各种配置,复杂得很. 之前在网上找到python的实现,在文件夹内运行一行代码就可以了,但是可惜,本机访问都很慢. ...