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 ...
随机推荐
- AWS 推出长期支持的 OpenJDK 免费分发版本 —— Amazon Corretto
简评:听说 Oracle JDK 要收费了,Oracle 要限制 Java 的商业或生产用途,针对这个问题,AWS 将会推出 Amazon Corretto. Java 是 AWS 用户使用的最流行的 ...
- 在Myeclipse中查看android源码就是这么easy
在开发android 时不能查看源码必是很不爽的一件事,看过网上一些文章后(都是2.0以前的版本,跟我的2.2最新版本的配置是不一样的)不过还是给了我启示,通过配置终于可以在myeclipse中查看源 ...
- SAE实践——用SVN命令行同步/提交代码
1. 同步应用到本地 注:首次使用svn需要输入安全认证密码 在终端输入以下命令 svn co https://svn.sinaapp.com/nyhello nyhello替换为自己的应用名称. 用 ...
- iOS学习笔记(4)——显示单组件选取器
1. 创建工程 创建新工程,create a new Xcode project 创建single view application 创建名为PickerViewTest的工程 2. 创建xib文件 ...
- 核心API的使用(获取两个字符串的最大相同子串)
/** * 获取两个字符串的最大相同子串. 例:abegad acegab */public class TheSameString { public static void main(String[ ...
- Centos7.4下安装Redis5.0
一.下载Redis Redis下载地址:https://redis.io/download 二.安装依赖包 安装Redis之前需要安装c++命令 yum install gcc-c++ 三.上传并解压 ...
- Asp.net的生命周期之应用程序生命周期
参考:http://msdn.microsoft.com/zh-cn/library/ms178473(v=vs.100).aspx 参考:http://www.cnblogs.com/JimmyZh ...
- C#-进制转化
(一)数制 计算机中采用的是二进制,因为二进制具有运算简单,易实现且可靠,为逻辑设计提供了有利的途径.节省设备等优点,为了便于描述,又常用八.十六进制作为二进制的缩写.一般计数都采用进位计数,其特点是 ...
- django在model中添加字段报错
在以下类中添加 description 字段后, class Colors(models.Model): colors = models.CharField(u'颜色', max_length=10) ...
- Java NIO学习与记录(八): Reactor两种多线程模型的实现
Reactor两种多线程模型的实现 注:本篇文章例子基于上一篇进行:Java NIO学习与记录(七): Reactor单线程模型的实现 紧接着上篇Reactor单线程模型的例子来,假设Handler的 ...