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 ...
随机推荐
- Python(简单计算器)
参考:https://www.cnblogs.com/alex3714/articles/5169958.html import re ret = re.search('\([^()]+\)','(1 ...
- POJ 2069 模拟退火算法
Super Star Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6422 Accepted: 1591 Spec ...
- 【微信小程序】——wxss引用外部CSS文件及iconfont
小程序引入外部文件的方式是:@import "*/*.wxss"; 因为业务需要,正在开发的小程序中需要使用iconfont,很容易想到了H5的引入方式: ```` @font-f ...
- iOS学习笔记(7)——解析json中的中文
NSURL *url = [NSURL URLWithString:@"http://nycode.sinaapp.com/d.php"]; NSError *error = ni ...
- node.js常用命令
安装node 验证是否安装node $node -v $npm -v npm node package manager , Node 的包管理器 安装 包 # 安装到当前目录 $ npm instal ...
- 九省联考 2018 Day 1 复现
前言 今年省选还有 15 天.每天针对性刷题学知识点有点枯燥,想到真题还没刷,就对着 pdf 做了一遍. A. 一双木棋 去年省选得了 25,应该是 \(n=2,m=2\) 的贪心和 \(m=1\) ...
- ToolkitScriptManager vs. ScriptManager 关于“只能向页面中添加 ScriptManager 的一个实例”讨论
在使用ASP.NET设计AJAX功能网页时,需要首先声明ToolkitScriptManager或者ScriptManager控件,这些全局的脚本核心控制,然后才能使用众多的AJAX控件.如果没有创建 ...
- net与树莓派的情缘-安装与卸载MySql(五)
安装MySql sudo apt-get install mysql-server 删除 mysql sudo apt-get autoremove --purge mysql-server-5.0s ...
- AngularJS指令详解
一.什么是指令? 在<AngularJs权威教程>中,指令可以简单理解成特定的DOM元素上运行的函数:我认为还可以理解成将将自定义的HTML标签解析成原始的标签,然后为其加入一些扩展的功能 ...
- hadoop-2.6.0.tar.gz的集群搭建(3节点)(不含zookeeper集群安装)
前言 本人呕心沥血所写,经过好一段时间反复锤炼和整理修改.感谢所参考的博友们!同时,欢迎前来查阅赏脸的博友们收藏和转载,附上本人的链接http://www.cnblogs.com/zlslch/p/5 ...