java实战:多属性排序
多属性排序的核心点就是对Arrays.sort()和Collections.sort()方法的Comparator进行重写
- Arrays.sort()的三种用法
1.1、Arrays.sort(int[] a) 这种形式是对一个数组的所有元素进行排序,并且是按从小到大的顺序。较常用
1.2、Arrays.sort(int[] a, int fromIndex, int toIndex)
这种形式是对数组部分排序,也就是对数组a的下标从fromIndex到toIndex-1的元素排序,注意:下标为toIndex的元素不参与排序!
1.3、对Comparator进行重写,即多属性排序,以二维数组为例,共列举两种场景:
场景1:
public static void main(String[] args) {
int[][] arr = {{2, 6, 4}, {6, 5, 7}, {6, 1, 1}};
Arrays.sort(arr, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[1]-o2[1]; // 按第2列升序排列 return o1[0]-o2[0] 表示按第一列排序
});
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
场景:2:按二维数组的第一列升序排序,如果第一列值相同,就按第二例降序排序
public static void main(String[] args) {
int[][] arr = {{2, 6, 4}, {6, 5, 7}, {6, 1, 1}};
Arrays.sort(arr, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if(o1[0]>o2[0]){
return 1;
}else if(o1[0]<o2[0]){
return -1;
}else{
return o2[1]-o1[1];
}
}
});
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
场景3:按二维数组的第一列升序排序,如果第一列值相同,就按第二例升序排序,如果第二列值相同,就按第3列升序排序,以此类推。。。
public static void main(String[] args) {
int[][] arr = {{2, 6, 4}, {6, 5, 7}, {6, 1, 1}};
Arrays.sort(arr, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
for(int k=0;k<arr.length;k++){ // 下面这块就表示://如果按一条件比较结果相等,就使用第二个条件进行比较。
if(o1[k]>o2[k]){
return 1;
}else if(o1[k]<o2[k]){
return -1;
}else{
continue;
}
}
return 0;
}
});
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
总结:升序:o1-o2 降序:o2-o1 如果compare() 入参是基本数据类型 或char类型可以直接用减号“-”,
如果compare() 入参是Byte, Double, Integer, Float, Long 或 Short 这些包装类型,或者是String类型,可以替换如下:
升序:o1.compareTo(o2 ) 降序:o2.compareTo(o1 )
- Collections.sort()的用法
场景1:对于字符串类型的集合进行排序,按首字母升序,如果第一列值相同,就按照第二列降序排列。
public static void main(String[] args) {
List<String> ls = new LinkedList<>();
ls.add("abdh");
ls.add("bmkhy");
ls.add("cbdga");
ls.add("aasd");
// Collections.sort(ls); //默认是按字典序列升序
// 按首字母升序,如果第一列值相同,就按照第二列降序排列,以此类推
Collections.sort(ls, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
// return o1.compareTo(o2); // 升序 如果是基本类型的包装类型,也可以用o1-o2,或o2-o1
if (o1.charAt(0) > o2.charAt(0)) {
return 1;
} else if (o1.charAt(0) < o2.charAt(0)) {
return -1;
} else { // 即o1.charAt(0) = o2.charAt(0) 返回值是0
return o2.charAt(1) - o1.charAt(1);
}
}
});
for (int i = 0; i < ls.size(); i++) {
System.out.println(ls.get(i));
}
}
场景2:对于字符串类型的集合进行排序,按首字母升序,如果第一列值相同,就按照第二列升序排列,如果第2列值相同,就按照第3列升序排列,以此类推。。
public static void main(String[] args) {
List<String> ls = new LinkedList<>();
ls.add("abdh");
ls.add("bmkhy");
ls.add("cbdga");
ls.add("aasd");
Collections.sort(ls, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2); //compareTo()方法比较的时候是按照ASCII码逐位比较的
}
});
for (int i = 0; i < ls.size(); i++) { System.out.println(ls.get(i)); } }
场景2结果:

java实战:多属性排序的更多相关文章
- java List 根据属性排序
Collections.sort(fileItems, new Comparator<FileItem>() { public int compare(FileItem arg0, Fil ...
- Java对象根据属性排序
参考:https://blog.csdn.net/wangtaocsdn/article/details/71500500
- java和python根据对象某一个属性排序
最近在学习java,目前看到java如何对一个对象列表进行排序. 我有一个Member类: public Member(String name,Calendar birthday,Sex gender ...
- java 对list中对象按属性排序
实体对象类 --略 排序类----实现Comparator接口,重写compare方法 package com.tang.list; import java.util.Comparator; publ ...
- java 中根据类的属性排序
package edu.del; import java.util.ArrayList; import java.util.Collections; import java.util.List; im ...
- java工具类之按对象中某属性排序
import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang ...
- SVN与TortoiseSVN实战:属性的奇技淫巧(二)
硬广:<SVN与TortoiseSVN实战>系列已经写了七篇,本系列结合TortoiseSVN对SVN中容易被忽视的部分进行了详解. 关于属性的奇技淫巧较多,分为两篇来写,第一篇详见< ...
- Java线性表的排序
Java线性表的排序 ——@梁WP 前言:刚才在弄JDBC的时候,忽然觉得order-by用太多了没新鲜感,我的第六感告诉我java有对线性表排序的封装,然后在eclipse里随便按了一下“.” ,哈 ...
- 【Java】对ArrayList排序
java如何对ArrayList中对象按照该对象某属性排序 (从小到大) 两种方法: 方法一:Comparator<KNNNode> comparator = new Comparator ...
- 手把手教你如何用java8新特性将List中按指定属性排序,过滤重复数据
在java中常常会遇到这样一个问题,在实际应用中,总会碰到对List排序并过滤重复的问题,如果List中放的只是简单的String类型过滤so easy,但是实际应用中并不会这么easy,往往List ...
随机推荐
- IDA 常用快捷键记录
常用快捷键1 1.切换文本视图与图表视图 空格键 2.返回上一个操作地址 ESC 3.搜索地址和符号 G 4.对符号进行重命名 N 5.常规注释 冒号键 6.可重复注释 分号键 7.添加标签 Alt+ ...
- 临时修改session日期格式冲突问题
输入的格式要看你安装的ORACLE字符集的类型, 比如: US7ASCII, date格式的类型就是: '01-Jan-01' alter session set NLS_DATE_LANGUAGE ...
- HashMap源码窥探
目录 前言 HashMap的数据结构 HashMap的put方法 HashMap的get方法 HashMap的初始化 HashMap的containsKey方法 HashMap的putAll方法 Ha ...
- 使用 MyBatis 操作 Nebula Graph 的实践
本文首发于 Nebula Graph Community 公众号 我最近注意到很多同学对于 ORM 框架的需求比较迫切,而且有热心的同学已经捐赠了自己开发的项目,Nebula 社区也在 working ...
- Nebula Graph 的 KV 存储分离原理和性能测评
本文首发于 Nebula Graph Community 公众号 1. 概述 过去十年,图计算无论在学术界还是工业界热度持续升高.相伴而来的是,全世界的数据正以几何级数形式增长.在这种情况下,对于数据 ...
- 【XInput】手柄模拟鼠标运作之 .NET P/Invoke 和 UWP-API 方案
上一篇中,老周简单肤浅地介绍了 XInput API 的使用,并模拟了鼠标移动,左.右键单击和滚轮.本篇,咱们用 .NET 代码来完成相同的效果. 说起来也是倒霉,博文写了一半,电脑忽然断电了.不知道 ...
- Netty笔记(6) - 粘包拆包问题及解决方案
Netty 中 TCP 粘包拆包问题 信息通过tcp传输过程中出现的状况 . TCP是个"流"协议,所谓流,就是没有界限的一串数据.TCP底层并不了解上层业务数据的具体含义,它会根 ...
- Java UML类图
在UML的静态机制中类图是一个重点,它不但是设计人员关心的核心,更是实现人员关注的核心.建模工具也主要根据类图来产生代码.类图在UML的9个图中占据了一个相当重要的地位.James Rumbaugh对 ...
- PhpStorm设置FTP功能
1.版本介绍 本文操作针对PhpStorm 2020.1版本 2.[ctrl + alt + s]打开设置,选择"Build,Execution,Deployment" 3.选择& ...
- picgo+gitee+typora实现博客图床
背景 在微信公众号编写了推文后,从推文里面复制内容出来在其他平台发布,会出现图片展示不出来的情况,原因是因为该图片是微信的链接,被限制在其他平台显示. 诉求 编写的推文在多个平台都能进行发布,图片在多 ...