java 通用对象排序
一个排序类,一个排序util?
no、no、no……
使用反射机制,写了一个通用的对象排序util,欢迎指正。
实体类:
package entity; public class BaseTypeEntity {
public BaseTypeEntity(int i, String sg, double d, float f, short st, long l, char c) {
super();
this.i = i;
this.sg = sg;
this.d = d;
this.f = f;
this.st = st;
this.l = l;
this.c = c;
}
@Override
public String toString() {
return "BaseTypeEntity [i=" + i + ", sg=" + sg + ", d=" + d + ", f=" + f + ", st=" + st + ", l=" + l + ", c="
+ c + "]";
}
private int i;
private String sg;
private double d;
private float f;
private short st;
private long l;
private char c; public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
public String getSg() {
return sg;
}
public void setSg(String sg) {
this.sg = sg;
}
public double getD() {
return d;
}
public void setD(double d) {
this.d = d;
}
public float getF() {
return f;
}
public void setF(float f) {
this.f = f;
}
public short getSt() {
return st;
}
public void setSt(short st) {
this.st = st;
}
public long getL() {
return l;
}
public void setL(long l) {
this.l = l;
}
public char getC() {
return c;
}
public void setC(char c) {
this.c = c;
} }
排序类(重点--圈一下,考试要考):
package util; import java.lang.reflect.Field;
import java.util.Comparator; @SuppressWarnings("rawtypes")
public class ComparatorUtil implements Comparator{
//要排序的属性名
private String name;
//是否升序
private boolean falg = true;
/**
* @param name 要排序的属性名,如果是基本类型的排序,请入null值
* @param falg false/true : 升序/降序
*/
public ComparatorUtil(String name, boolean falg) {
super();
this.name = name;
this.falg = falg;
} @Override
public int compare(Object o1, Object o2) {
int result = 0;
//入参为空|参数类型不相等,都不进行处理。
if(o1 == null || o2 == null || !o1.getClass().getName().equals(o2.getClass().getName())){
return result;
}
//7大基本类型的处理(boolean除外.且把Collections.reverse()/Collections.sort()的事也做了)
if(isBaseType(o1)){
//比较
return baseTypeOpt(o1,o2);
}
try {
Field f1 = o1.getClass().getDeclaredField(name);
Field f2 = o2.getClass().getDeclaredField(name);
//设置private可读
f1.setAccessible(true);
f2.setAccessible(true);
result = baseTypeOpt(f1.get(o1),f2.get(o2));
} catch (Exception e) { //异常懒得处理了,如果没有对应的属性,那就不排序了.(手动滑稽)
e.printStackTrace();
}
return result;
} private int baseTypeOpt(Object o1, Object o2) {
int result = 0;
if(o1 instanceof String){
result = o1.toString().compareTo(o2.toString());
}else if(o1 instanceof Integer){
result = ((Integer)o1) - ((Integer)o2);
}else if(o1 instanceof Double){
if(((Double)o1 - (Double)o2) > 0){
result = 1;
}else if(((Double)o1 - (Double)o2) < 0){
result = -1;
}
}else if(o1 instanceof Float){
if(((Float)o1 - (Float)o2) > 0){
result = 1;
}else if(((Float)o1 - (Float)o2) < 0){
result = -1;
}
}else if(o1 instanceof Character){
result = ((Character)o1).compareTo(((Character)o2));
}else if(o1 instanceof Short){
result = ((Short)o1) - ((Short)o2);
}else if(o1 instanceof Long){
if(((Long)o1 - (Long)o2) > 0){
result = 1;
}else if(((Long)o1 - (Long)o2) < 0){
result = -1;
}
}
//降序
if(isFalg()){
result = -result;
}
return result;
} private boolean isBaseType(Object o) {
if((o instanceof String) || (o instanceof Integer)
|| (o instanceof Double) || (o instanceof Float)
|| (o instanceof Character) || (o instanceof Short)
|| (o instanceof Long)){
return true;
}
return false;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public boolean isFalg() {
return falg;
} public void setFalg(boolean falg) {
this.falg = falg;
} }
测试类:
package util; import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import entity.BaseTypeEntity;
import entity.User; public class MainTest { public static void main(String[] args) {
//基本类型排序
baseTypeSort();
//对象排序
objectSort();
} private static void baseTypeSort(){
List<String> ss = new ArrayList<String>();
ss.add("aa");
ss.add("bc");
ss.add("ac");
ss.add("ba");
ss.add("dd");
ss.add("da");
System.out.println("before sort:");
System.out.println(ss);
System.out.println("sort end");
//倒序
Collections.reverse(ss);
System.out.println(ss);
} private static void objectSort(){
List<BaseTypeEntity> btes = new ArrayList<BaseTypeEntity>();
BaseTypeEntity bte = new BaseTypeEntity(1, "abc", 12d, 15f, (short) 3, 600l, 'd');
btes.add(bte);
bte = new BaseTypeEntity(2, "aba", 122d, 152f, (short) 2, 602l, 'a');
btes.add(bte);
bte = new BaseTypeEntity(3, "aac", 132d, 132f, (short) 1, 3l, 'a');
btes.add(bte);
System.out.println("before sort:");
for(BaseTypeEntity b : btes){
System.out.println(b);
}
//开始排序
Collections.sort(btes,new ComparatorUtil("d",true));
System.out.println("sort end");
for(BaseTypeEntity b : btes){
System.out.println(b);
}
} }
(少于150个字,不让发布)
来点人生感悟,凑字数。
7月初刚刚换好工作,个人感觉还是进大公司好,各方面很规范。之前的小公司,就没有规范一说了。业务不行了,就解散了整个研发部,然后没有按照国家的法律来走,我还差一个月就工作满一年了,才补贴半个月……还强迫我们签离职协议,不签就不补。
语气强硬的说:就补这么多,不服可以去劳动局闹,我们不怕。-------确实牛哈
欢迎评论、指正。
java 通用对象排序的更多相关文章
- [个人原创]关于java中对象排序的一些探讨(三)
这篇文章由十八子将原创,转载请注明,并标明博客地址:http://www.cnblogs.com/shibazijiang/ 对对象排序也可以使用Guava中的Ordering类. 构造Orderin ...
- java对对象排序
一.前言 有时我们需要对类按照类中的某一个属性(或者多个属性)来对类的对象进行排序,有两种方法可以实现,一种方法是类实现Comparable<T>接口,然后调用Collections.so ...
- [个人原创]关于java中对象排序的一些探讨(一)
有的时候我们需要将自己定义的对象,有序输出.因为一般我们程序的中间结果需要存储在容器里,那么怎样对容器中的对象按照一定次序输出就是程序员经常需要考虑的问题.本片文章探讨了怎样有序化输出容器中的对象的问 ...
- JAVA list对象排序加去重问题
对象类实现继承Comparable接口重写compareTo方法实现排序功能,重写equals方法实现去重功能(根据ID去重)public class TestAbilityAnalyze imple ...
- [个人原创]关于java中对象排序的一些探讨(二)
2. 使用Collections.sort()方法 Collections类中提供了诸多静态方法,诸如addAll(),max()等等.当自己相对Collection接口下的类处理的时候,可以看看这 ...
- List对象排序的通用方法
转自 @author chenchuang import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Me ...
- Java对象排序
java实现对象比较,可以实现java.lang.Comparable或java.util.Comparator接口 //Product.java import java.util.Date; //p ...
- Java - 简单的对象排序 - Comparator
注:对象排序,就是对对象中的某一字段进行比较,以正序或倒序进行排序. 例: 需要排序的对象: public class Person { public int age; public String n ...
- Java集合中对象排序
集合中的对象排序需求还是比較常见的.当然我们能够重写equals方法,循环比較:同一时候Java为我们提供了更易使用的APIs.当须要排序的集合或数组不是单纯的数字型时,通常能够使用Comparato ...
随机推荐
- HDU 3007 模拟退火算法
Buried memory Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- HBase二级索引的设计
摘要 最近做的一个项目涉及到了多条件的组合查询,数据存储用的是HBase,恰恰HBase对于这种场景的查询特别不给力,一般HBase的查询都是通过RowKey(要把多条件组合查询的字段都拼接在RowK ...
- Linux 解压 压缩文件
来源于:http://blog.csdn.net/mmllkkjj/article/details/6768294/ 解压 tar –xvf file.tar //解压 tar包tar -xzvf f ...
- java使用memcached2--集群部署
一.集群安装 1.编译安装magent-0.5到/usr/local/下 # cd /usr/local # mkdir magent # cd magent/ # wget http://memag ...
- 使用unordered_map提升查找效率
在对网络数据包流(Flow)进行处理的时候,一开始为了简单使用了vector做为Flow信息的存储容器,当其中的元素达到几十万时,程序的执行速度让人无法忍受.已经对vector进行过合理的预先rese ...
- 1. Socket网络编程
1. 借助服务器实现小写转大写的程序: 客户端:发送任意小写字母到服务器端. 服务器端:接收小写字母,转为大写,回传给客户端,然后客户端显示到屏幕. #include <stdio.h> ...
- allure报告定制(pytest+jenkins)
环境及安装可查看 pytest+jenkins安装+allure导出报告 要让allure报告更漂亮,更直观,需要在脚本中写入allure特性 一开始allure调用step().story().fe ...
- javaweb Servlet接收Android请求,并返回json数据
1.实现功能 (1)接收http请求 (2)获取Android客户端发送的参数对应的内容 (3)hibernate查询数据库 (4)返回json数据 2.java代码 import EntityCla ...
- testng XMl 参数化
方法一: 方法二: 方法三: (1)如果测试的数据较多的情况下,很显然这种方式不适合,那么可以通过@DataProvider生成测试数据,通过@Test(dataProvider = "&q ...
- Mac下使用crontab来实现定时任务
说明: 1.Linux和Mac下操作crontab都是一致的 2.配置文件都在/etc/crontab下,如果没有就创建. 3.测试发现直接使用crontab -e命令创建的定时任务是放在临时文件夹的 ...