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 ...
随机推荐
- spring boot整合mybatis-plus报错:There is no getter for property named ‘ew‘ in ‘xxx‘
问题说明 spring boot整合mybatis-plus报错:There is no getter for property named 'ew' in 'xxx' 问题解决 XXXmapper. ...
- java zTree异步加载实战
zTree简介 zTree 是一个依靠 jQuery 实现的多功能 "树插件".优异的性能.灵活的配置.多种功能的组合是 zTree 最大优点. zTree 是开源免费的软件(MI ...
- SecureCRT很好用的几个快捷键
以下是我在使用SecureCRT这个SSH工具时用到的很实用的快捷键,与大家分享: [Alt]+[Enter]:全屏 [Alt]+[B]: 快速打开新的连接 [Alt]+[1/2/3/4/5.../9 ...
- 浅入kubernetes(3):namespace、node、pod
目前已经完成三篇关于 kubernetes 的文章: 在 Ubuntu 上安装 K8S教程 浅入kubernetes(1):Kubernetes 入门基础 浅入kubernetes(2):Kubern ...
- Advanced .Net Debugging 3:基本调试任务(上)
一.简介 这是我的<Advanced .Net Debugging>这个系列的第三篇文章.这个系列的每篇文章写的周期都要很长,因为每篇文章都是原书的一章内容(太长的就会分开写).再者说,原 ...
- 【苹果】SpringBoot监听Iphone15邮件提醒,Selenium+Python自动化抢购脚本
前言 缘由 Iphone15来了,两年之约你还记得吗? 遂整合之前iphone13及iphone14的相关抢购代码,完成一个SpringBoot监听Iphone15有货邮件提醒+python自动化脚本 ...
- [.Net]使用Soa库+Abp搭建微服务项目框架(五):服务发现和健康监测
上篇文章说过,服务发现和健康监测是面向服务体系架构重要的模块,Soa库可以配置使用Consul作为服务发现服务,或者轮询已配置的服务列表作为本机服务发现. 将用Hangfire来作为服务发现与健康监 ...
- Zabbix与乐维监控对比分析(五)——可视化篇
前面我们详细介绍了Zabbix与乐维监控的架构与性能.Agent管理.自动发现.权限管理.对象管理.告警管理方面的对比分析,相信大家对二者的对比分析有了相对深入的了解,接下来我们将对二者的可视化功能进 ...
- k8s资源管理之ResourceQuota、LimitRange和QoS
ResourceQuota ResourceQuota 是 Kubernetes 中的一个资源配额对象,用于限制命名空间(Namespace)中资源的使用量.ResourceQuota 可以限制命名空 ...
- Android使用poi遇到的问题
原文:Android使用poi遇到的问题 关于Poi使用可以看这一篇[开源库推荐]#4 Poi-办公文档处理库 本篇主要讲些在Android上使用出现的问题 问题 原本是需要一个导出xlsx表格文件的 ...