Java利用反射排序
前言
Java为我们提供了几种排序得方法,比如Arrays和Collections类,但是前提是数组或者集合中的元素都必须实现Comparable接口,基本的数据类型都已经实现了Comparable接口了,所以我们才能够直接对基本类型的数组或者集合进行排序,比如Float和Integer类得源码.


今天记录一下对Comparable得使用和反射得使用.
先看一个Student类

我们要对他进行年龄排序,可以用冒泡进行排序,或者用选择排序法

但是这不是主角,
而我们要用Comparable接口进行排序,所以先要实现它.并重写compareTo方法,这个方法才是用来比较对象的,也就是this和传入过来的obj进行比较,返回值代表:
>0 则this>obj,
=0 则this=obj
<0 则this<obj

其实我们可以这样简写一下,原理是一样的.

如果想降序呢?直接在前面加一个负号呗

直接调用Collections.sort(list)进行排序,是不是简单多了呢
但是此时,Student多了个字段money,我们要多money进行排序,但是我们又想保留年龄排序方式,那么Comparable就不太合适了
Comparator
我们可以用Collections.sort第二个重载方法,他接收两个参数,第一个是要排序的集合,第二个是Comparator接口.
他和Comparable不同之处在于Comparable对内,而Comparator对外.原理也是一样.
其实Collections.sort的两个重载方法都是调用List的sort方法,但是如果list.sort想传null,则必须要求T(也就是这个类)必须实现了Comparable接口,不然他没办法排序.如果这个类不想实现Comparable接口,那就使用对外接口Comparator.


写两个不同字段的排序方法.同样,如果想降序,前面加一个负号就可以

但是!!!
此时又多了一个字段身高height,我们又想对height进行排序,那是不是又要写一个方法呢?显然必须要写,不写怎么排?但是往后越来越多的字段加入,这么做肯定不好.
那要怎么做?
先分析一下,这种方法排序无非就是获取某个字段的值,然后相减返回,那我们可以封装一下,利用反射获取某个类的字段值,先看代码.

在此,声明了一个sort方法
参数list,代表要排序的集合,
参数fieldName,代表要排序的字段
参数isDesc,是否降序
访问private的字段首先要对field调用setAccessible(true),否则会报错.
因为这个字段可能是不同类型,所以统一先转成Double类型,之后调用intValue方法.
怎么样,是不是很简单了呢?
流年有爱
岁月静好
Java利用反射排序的更多相关文章
- java利用反射获取类的属性及类型
java利用反射获取类的属性及类型. import java.lang.reflect.Field; import java.math.BigDecimal; import java.util.Map ...
- java利用反射调用类的某个方法
java利用反射机制 可以动态调用某个类的某个方法,在 扩展系统功能或提供对外接口时经常用的到. 代码如下: 打印类Print.java package com.test.reflct; /** * ...
- 【转】Java利用反射机制访问私有化构造器
Java利用反射机制访问私有化构造器 博客分类: java 我们都知道,当一个类的构造方法被设为私有的时候(private),在其他类中是无法用new来实例化一个对象的. 但是有一种方法可以把带有 ...
- java利用反射机制判断对象的属性是否为空以及获取和设置该属性的值
1.java利用反射机制判断对象的属性是否为空: Map<String,String> validateMap = new LinkedHashMap<String, String& ...
- Java利用反射取得类的所有信息
Java中可以利用反射获取类的名称.构造函数.属性.方法.也就是说可以通过反射可以取得类的所有信息(不管该成员是否封装为private). 如有下面的Dept类定义: package org.lyk. ...
- java利用反射访问类的私有(private)属性及方法
Java语言中,在一个类中,为了不让外界访问到有的属性和方法,通常将其设置为private,用正常的方式(对象名.属性名,对象名.方法名)将无法访问此属性与方法,但有没有其他方法可以访问呢?答案是有的 ...
- Java——利用反射机制将表单数据自动填充到JavaBean中
以一个案例介绍反射机制的一种常见的使用场景,以及具体实现. 1.本文案例 在编写Java Web应用程序时,使用表单提交数据是一个必不可少的环节,后台对于前台使用表单提交的数据需要能够从请求中解析,并 ...
- java利用反射交换两个对象中的字段相同的字段值
有时候我们的两个对象字段都是一样的,只有极少的区别,想要把一个对象字段的值,赋值给另外一个对象值 然后传给另外一个方法使用,但是这个字段太多,一个一个的复制太过繁琐. 这时候利用反射解决这个问题. c ...
- java利用反射绕过私有检查机制实行对private、protected成员变量或方法的访问
在java中,如果类里面的变量是声明了private的,那么只能在被类中访问,外界不能调用,如果是protected类型的,只能在子类或本包中调用,俗话说没有不透风的墙.但是可以利用java中的反射从 ...
随机推荐
- HTTP 8中请求方式介绍
HTTP请求方式中8种请求方法(简单介绍) 简单介绍 HTTP是超文本传输协议,其定义了客户端与服务器端之间文本传输的规范.HTTP默认使用80端口,这个端口指的是服务端的端口,而客户端使用的端口 ...
- Drop Table对MySQL的性能影响分析
[问题描述] 最近碰到有台MySQL实例出现了MySQL服务短暂hang死,表现为瞬间的并发线程上升,连接数暴增. 排查Error Log文件中有page_cleaner超时的信息,引起我们的关注: ...
- (五十八)c#Winform自定义控件-管道阀门(工业)
前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...
- Codefroces 366 D Dima and Trap Graph (最短路)
Dima and Trap Graph 题意:Dima和Inna越来越喜欢对方,但是Dima的室友缺很没有热情出去玩,然后Dima就把他室友Seryozha骗进了陷阱里.现在Seryozha想要从陷阱 ...
- poj 2912 Rochambeau(枚举+带权并查集)
题目链接:http://poj.org/problem?id=2912 题意:多个人玩石头剪刀布分成3组和一个裁判,每一组提前选定了自己出哪个手势,裁判可以随意出什么手势,问是否能够从给出的一系列石头 ...
- RobotFramework自动化测试框架-MongoDBLibrary库的使用
笔者接着 RobotFramework自动化测试框架-DatabaseLibrary库的使用(对数据库的操作) 继续分享robotframework 对数据库中的MongoDB的详细操作. Mongo ...
- 5分钟理解 SpringBoot 响应式的核心-Reactor
目录 一.前言 二. Mono 与 Flux 构造器 三. 流计算 1. 缓冲 2. 过滤/提取 3. 转换 4. 合并 5. 合流 6. 累积 四.异常处理 五.线程调度 小结 参考阅读 一.前言 ...
- Go语言标准库之flag
Go语言内置的flag包实现了命令行参数的解析,flag包使得开发命令行工具更为简单. os.Args 如果你只是简单的想要获取命令行参数,可以像下面的代码示例一样使用os.Args来获取命令行参数. ...
- ConcurrentHashMap 的工作原理及代码实现
ConcurrentHashMap采用了非常精妙的"分段锁"策略,ConcurrentHashMap的主干是个Segment数组.Segment继承了ReentrantLock,所 ...
- Django之FBV和CBV的用法
FBV FBV,即 func base views,函数视图,在视图里使用函数处理请求. 以用户注册代码为例, 使用两个函数完成注册 初级注册代码 def register(request): &qu ...