使用JAVA自己的排序方法,有的时候是一个可行的选择。

先从简单的开始说起。

一、少数key的情况

有一个需求:根据 menu_level,sort排序,越小的越前面。

--

下面代码按照升序规则进行!

--

Collections.sort(menuList, new Comparator>() {

@Override

public int compare(Map o1, Map o2) {

// 进行判断

//compareTo当前面小于后面的时候,返回-1。也就是说如果要倒序,那么只要返回1即可。

int cpLevel=((Integer) o1.get("menu_level")).compareTo((Integer) o2.get("menu_level"));

Integer sort1=(o1.get("sort")==null)?10000:(Integer) o1.get("sort");

Integer sort2=(o2.get("sort")==null)?10000:(Integer) o2.get("sort");

int cpSort=sort1.compareTo(sort2);

if (cpLevel==1) {

return 1;

}

else if(cpLevel==0) {

return cpSort;

}

else {

return -1;

}

//return ;

}

});

---

现在稍微复杂下,后文是3个key的比较。

譬如有数据表books,它们的数据如下:select * from  books order by author,price desc,publisher

2

102

生命在于运动

lml

1000.00

中华出版社

5

103

2020年异象

lml

90.00

福建出版社

9

108

以史鉴今

lml

90.00

西安出版社

4

104

奋斗在上海

lzf

1000.00

publzf

8

107

学习方法论

lzf

99.00

中天出版社

7

106

论自力更生的必要性

lzf

99.00

秦皇汉武

3

1498591124

Professional Java for Web Applications

Nicholas S. Williams

59.99

John Wiley & Sons

6

105

21世纪-中国-前进

五十

83.00

附件出版社

现在希望通过java排序, 代码如下:

@Overridepublic List>sortByNKeys() {

String sql= "select author,price,publisher,isbn,title from books";

List> bookList =jdbcTp.queryForList(sql);//使用java 8的 stream 功能进行排序//order by author,price desc,publisher

/*** 升序返回-1,倒序返回1即可 有多个key需要比较的时候(不考虑null或者""的情况),当第n个key返回的是0的时候继续比较,如果不是

* 则根据第n个key的比较值返回需要的结果。 譬如第1个key的比较结果是0,则比骄傲第2个, 假定第二的key的比较结果是-1

* 如果要根据第二个倒序,则返回1;如果要根据第二个升序,则直接发那会-1即可 以此类推*/Collections.sort(bookList,new Comparator>() {

@Overridepublic int compare(Map o1, Mapo2) {//进行判断

int cp1 = ((String) o1.get("author")).compareTo((String) o2

.get("author"));

BigDecimal price1= new BigDecimal(o1.get("price").toString());

BigDecimal price2= new BigDecimal(o1.get("price").toString());int cp2 =price1.compareTo(price2);

String p1= o1.get("publisher").toString();

String p2= o2.get("publisher").toString();int cp3 =p1.compareTo(p2);if (cp1 == 0) {if (cp2 == 0) {if (cp3 == 0) {return 0;

}else{returncp3;

}

}else{return cp2 * -1;

}

}else{returncp1;

}//return ;

}

});returnbookList;

}

结果输出如下:

[{"author": "Nicholas S. Williams","price": 59.99,"publisher": "John Wiley & Sons","isbn": "1498591124","title": "Professional Java for Web Applications"}, {"author": "lml","price": 1000.00,"publisher": "中华出版社","isbn": "102","title": "生命在于运动"}, {"author": "lml","price": 90.00,"publisher": "福建出版社","isbn": "103","title": "2020年异象"}, {"author": "lml","price": 90.00,"publisher": "西安出版社","isbn": "108","title": "以史鉴今"}, {"author": "lzf","price": 1000.00,"publisher": "publzf","isbn": "104","title": "奋斗在上海"}, {"author": "lzf","price": 99.00,"publisher": "中天出版社","isbn": "107","title": "学习方法论"}, {"author": "lzf","price": 99.00,"publisher": "秦皇汉武","isbn": "106","title": "论自力更生的必要性"}, {"author": "五十","price": 83.00,"publisher": "附件出版社","isbn": "105","title": "21世纪-中国-前进"}]

注:之所以,有所区别,是因为mysql比较的时候,默认不考虑大小写;而java字符串的CompareTo则是按照unicode编码比较进行的。

二、不定个数key的情况

以上可以应付一些简单的要求,如果有不断变化的,任意个数的key需要比较,那么怎么做?

可以参考的一个终极方案,代码如下:

public voidsort() {

String dataJson="[{\r\n" +

" \"author\": \"Nicholas S. Williams\",\r\n" +

" \"price\": 59.99,\r\n" +

" \"publisher\": \"John Wiley & Sons\",\r\n" +

" \"isbn\": \"1498591124\",\r\n" +

" \"title\": \"Professional Java for Web Applications\"\r\n" +

"}, {\r\n" +

" \"author\": \"lml\",\r\n" +

" \"price\": 1000.00,\r\n" +

" \"publisher\": \"中华出版社\",\r\n" +

" \"isbn\": \"102\",\r\n" +

" \"title\": \"生命在于运动\"\r\n" +

"}, {\r\n" +

" \"author\": \"lml\",\r\n" +

" \"price\": 90.00,\r\n" +

" \"publisher\": \"福建出版社\",\r\n" +

" \"isbn\": \"103\",\r\n" +

" \"title\": \"2020年异象\"\r\n" +

"}, {\r\n" +

" \"author\": \"lml\",\r\n" +

" \"price\": 90.00,\r\n" +

" \"publisher\": \"西安出版社\",\r\n" +

" \"isbn\": \"108\",\r\n" +

" \"title\": \"以史鉴今\"\r\n" +

"}, {\r\n" +

" \"author\": \"lzf\",\r\n" +

" \"price\": 1000.00,\r\n" +

" \"publisher\": \"publzf\",\r\n" +

" \"isbn\": \"104\",\r\n" +

" \"title\": \"奋斗在上海\"\r\n" +

"}, {\r\n" +

" \"author\": \"lzf\",\r\n" +

" \"price\": 99.00,\r\n" +

" \"publisher\": \"中天出版社\",\r\n" +

" \"isbn\": \"107\",\r\n" +

" \"title\": \"学习方法论\"\r\n" +

"}, {\r\n" +

" \"author\": \"lzf\",\r\n" +

" \"price\": 99.00,\r\n" +

" \"publisher\": \"秦皇汉武\",\r\n" +

" \"isbn\": \"106\",\r\n" +

" \"title\": \"论自力更生的必要性\"\r\n" +

"}, {\r\n" +

" \"author\": \"五十\",\r\n" +

" \"price\": 83.00,\r\n" +

" \"publisher\": \"附件出版社\",\r\n" +

" \"isbn\": \"105\",\r\n" +

" \"title\": \"21世纪-中国-前进\"\r\n" +

"}]";

List> dataList = JSON.parseObject(dataJson,new TypeReference>>(){});

System.out.println(dataList);

List> sortList=new ArrayList>();

Map a1=new HashMap();

a1.put("code", "publisher");

a1.put("sortPosition", 3);

a1.put("sortDirection", "desc");

sortList.add(a1);

Map a2=new HashMap();

a2.put("code", "author");

a2.put("sortPosition", 2);

a2.put("sortDirection", "asc");

sortList.add(a2);

Map a3=new HashMap();

a3.put("code", "price");

a3.put("sortPosition", 1);

a3.put("sortDirection", "desc");

sortList.add(a3);

Map a4=new HashMap();

a4.put("code", "title");

a4.put("sortPosition", 4);

a4.put("sortDirection", "asc");

sortList.add(a4);

Map a5=new HashMap();

a5.put("code", "isbn");

a5.put("sortPosition", 5);

a5.put("sortDirection", "asc");

sortList.add(a5);

Collections.sort(sortList,new Comparator>() {

@Overridepublic int compare(Map o1, Mapo2) {//进行判断

int cp1 = o1.get("sortPosition").toString().compareTo(o2.get("sortPosition").toString());returncp1;

}

});int sortSize=sortList.size();int[] compareResultArr=new int[sortSize];

int[] sortDirectionArr=new int[sortSize];

String[] colArr=new String[sortSize];for(int i=0;i

compareResultArr[i]=0;

sortDirectionArr[i]=sortList.get(i).get("sortDirection").equals("asc")?1:-1;

colArr[i]=sortList.get(i).get("code").toString();

}//排序的时候,必须保证多行在custom_id之后,而单行在custom_id之前,避免数据混乱

Collections.sort(dataList, new Comparator>() {

@Overridepublic int compare(Map o1, Mapo2) {//进行判断

for(int i=0,len=sortSize;i

Object v1=o1.get(colArr[i]);

Object v2=o2.get(colArr[i]);if (v1 instanceofString) {

compareResultArr[i]=v1.toString().compareTo(v2.toString());

}else{

compareResultArr[i]=new BigDecimal(v1.toString()).compareTo(newBigDecimal(v2.toString()));

}

}for(int i=0,len=sortSize;i

}

}//如果都是一样,则直接返回0

return 0;

}

});

System.out.println(dataList);

}

解决思路也比较简单:

1)使用数组保存每个key的比较值和排序方向值(升序1,降序-1)

2)对比较的结果循环判断,只要有不等于0(相等的)就返回

上面的解决还比较粗暴,可以稍微改进下:

Collections.sort(dataList, new Comparator>() {

@Overridepublic int compare(Map o1, Mapo2) {//进行判断

for(int i=0,len=sortSize;i

Object v1=o1.get(colArr[i]);

Object v2=o2.get(colArr[i]);if (v1 instanceofString) {

compareResultArr[i]=v1.toString().compareTo(v2.toString());

}else{

compareResultArr[i]=new BigDecimal(v1.toString()).compareTo(newBigDecimal(v2.toString()));

}

//只要有一个不相等,就可以返回了

if (compareResultArr[i]*sortDirectionArr[i]!=0){

return compareResultArr[i]*sortDirectionArr[i];

}

}//如果都是一样,则直接返回0

return 0;

}

});

注意:

1)以上方案没有考虑更多的类型,都是java的基本包装类

2) 不适合要求高性能的环境。如有需要,应该考虑购买算法,或者是使用其它算法计算

3)如果您的应用排序的数据大概是一万行内,且对时间要求不是特别高,那么可以使用以上方法。

java map 多个key_java ListMap使用多个或者任意个数的key进行排序相关推荐

  1. java map 对象作为key_Java 将自定义的对象作为HashMap的key

    需要继承Map的equals函数和hashCode函数 package com.category; import java.util.HashMap; public class GenCategory ...

  2. Java map 知识

    Java map: Map 接口中键和值一一映射. 可以通过键来获取值 map 的方法如下: 序号 方法描述 1 void clear( )  从此映射中移除所有映射关系(可选操作). 2 boole ...

  3. java map 队列_Java:queue队列,map集合

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 Queue: 基本上,一个队列就是一个先入先出(FIFO)的数据结构 Queue接口与List.Set同一级别,都是继承了Collection接口.Lin ...

  4. java map 教程_Java Map接口

    Java Map接口 在本教程中,我们将学习Java Map接口及其方法. Java collections框架的Map接口提供了Map数据结构的功能. 它实现了Collection接口. map的工 ...

  5. Java Map hashCode深究

    [Java心得总结七]Java容器下--Map 在自己总结的这篇文章中有提到hashCode,但是没有细究,今天细究整理一下hashCode相关问题 1.hashCode与equals 首先我们都知道 ...

  6. 有关于Java Map,应该掌握的8个问题

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:一个线程池 bug 引发的 GC 思考!个人原创+1博客:点击前往,查看更多 前言 最近几天看了几篇有关于Jav ...

  7. java map 查找_Map 查找表操作

    packageseday13;importjava.util.HashMap;importjava.util.Map;/***@authorxingsir * java.util.Map 查找表,Ma ...

  8. java 轻量级map,java Map 遍历速度最优解

    java Map 遍历速度最优解 第一种: Map map = new HashMap(); Iterator iter = map.entrySet().iterator(); while (ite ...

  9. Java Map集合面试题汇总

    转载自 Java Map集合面试题汇总 1. 你都知道哪些常用的Map集合? 2.Collection集合接口和Map接口有什么关系? 3.HashMap是线程安全的吗?线程安全的Map都有哪些?性能 ...

最新文章

  1. 采购申请的处理流程 --- 责任链模式
  2. Activity全屏问题
  3. Redis事务(transaction)
  4. 手挽手带你学React:三档 React-router4.x的使用
  5. 10分钟学会vue滚动行为
  6. 数据结构——交换左右子树
  7. 毕业论文排版之Word 中公式居中,编号靠右该怎么设置(针对左右不对称页边距)
  8. 推荐一个值得加入C++开发者俱乐部
  9. 力扣231.2的幂 C语言
  10. 卡巴斯基称发现美国中情局CIA 开发的新恶意软件
  11. 使Docker Container支持运行SWT程序
  12. 15. POSIX 线程
  13. 基于MVC4+EasyUI的Web开发框架经验总结(5)--使用HTML编辑控件CKEditor和CKFinder
  14. VB里怎样使用GetWindowRect、GetClientRect、ScreenToClient、ClientToScreen
  15. html页面回退,HTML5小结
  16. 2022年值得选择的开源低代码平台
  17. Kubectl常用命令(三)
  18. C语言多组输入和字符输入(小白)
  19. No message found under code 'xxx' for locale 'zh_CN'.
  20. 计算机的3d打印机,DIY机械计算器,用3D打印技术体验更棒

热门文章

  1. 基于Spring cloud ribbon实现多版本控制
  2. JMeter基础 — JMeter的HTTP代理服务器详细介绍
  3. 如何修改ant design mobile或者其他UI组件的全局样式
  4. Vue实现福利彩票机选号码,彩票号码生成思路
  5. Python tkinter多窗口的交互问题:子窗口无法获取数据
  6. 阿里云国际站主要产品及功能全部介绍(注册流程)
  7. [转载]古诗词里的雨
  8. linux搭建sendmail邮件服务器,Linux系统Sendmail架设Mail服务器
  9. php 编辑器 插入视频,一段代码搞定KindEditor编辑器视频上传播放问题!!
  10. 以 dpdk应用层包处理程序为例谈谈多进程和多线程模型选择