- 浏览: 471869 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (190)
- ExtJS (40)
- JavaScript (16)
- Java设计模式 (13)
- Html (10)
- Tomcat (9)
- myeclipse (5)
- JSP (5)
- CSS (10)
- JS/CSS (1)
- windows (12)
- Navicat For MySQL (1)
- struts2 (6)
- Spring2.0 (1)
- Java反射机制 (5)
- hibernate (9)
- java (17)
- B/SWeb完美打印方案 (1)
- 数据库相关 (4)
- java web报表 (1)
- 报表打印 (2)
- java泛型 (1)
- Servlet (2)
- SVN (7)
- Log4j (0)
- android (3)
最新评论
-
kation733:
斯蒂芬斯蒂芬多萨法阿凡达是否阿萨德
同时开启两个Tomcat -
BlueBing:
一路的夏天 写道楼主的代码会报错吧!在前面的时候String ...
使用Java反射机制遍历实体类的属性和类型 -
ying890:
非常感谢!
Ext JS中文乱码解决方案 -
zhylandroid:
谢谢了,对我很有帮助
DatabaseMetaData开发实务(上) -
wendy.wujing:
maxHttpHeaderSize="8192&qu ...
查看Tomcat配置的端口
排序是编程中经常要碰到的问题,如果只是一般的数据库数据那么我们完全可以用数据sql语言来排序,但有的时候情况并不是这样,在一些特殊情况下我们不得不自己在java中写一些排序,而通常排序是一件让程序员非常恼火的事情,特别是那些可以让用户自由选择排序规则的情况,想想就头疼.今天正好公司一个组件就碰到了这样的情况,下面我说一下怎么来完成并且实现排序.
首先让我们来看一下用户需求是怎么样(为了更容易理解我将用户需求简化了一下,实际情况可能更复杂), 一个财务人员需要查询公司内所有用户的数据信息,对于查询出来的结果该用户能够自己定义排序规则(例如,他希望对用户姓名进行升序,同时对工资进行降序,并且对生日进行升序,也许有人会说这个直接用sql就能完成,请注意,这个用例是我简化了的,真实的情况会非常复杂,同时并不是一条sql就能解决的).
对于这个需求我们第一个想到的应该有一个员工信息对象(Employee),用户姓名,工资,生日都是这个对象的属性.用户的查询结果就是Employee对象的List.我们知道java本身提供了一个非常好的对于List的排序方法Collections.srot(List <T> list, Comparator c ), 如果我们有一个针对Employee的Comparator对象他知道如何对两个Employee对象进行比较,根据比较结果来决定Employee对象的排列顺序,这样就能够实现用户的需求.第二点,用户能够自己定义一组排序规则,那么我们应该有一个EmployeeSortOrder对象,它包含了所有用户所定义的每一条规则,从需求理解我们可以知道这些规则就是对Employee对象中某些属性定义他的排序规则(升序或者降序),那么我们可以通过引入一个(EmployeeOrder)对象来指明具体Employee对象中有的属性如何来排序,这里需要包括这些属性的类型,应该对于不同的属性比较方式是不一样的.需求分析到这里我们基本就可以得到一个实现排序的模型.
下面我们来看一下具体代码:
Employee对象,一个标准的javabean对象,实际情况可能会是一个更加复杂的对象
/** */ /**
*
*/
package com.demo.sort;
import java.math.BigDecimal;
import java.util.Date;
/** */ /**
* @author Administrator
*
*/
public class Employee ... {
private Long employeeId;
private String firstName;
private String lastName;
private Date birthday;
private BigDecimal payment;
public Date getBirthday() ... {
return birthday;
}
public void setBirthday(Date birthday) ... {
this .birthday = birthday;
}
public Long getEmployeeId() ... {
return employeeId;
}
public void setEmployeeId(Long employeeId) ... {
this .employeeId = employeeId;
}
public String getFirstName() ... {
return firstName;
}
public void setFirstName(String firstName) ... {
this .firstName = firstName;
}
public String getLastName() ... {
return lastName;
}
public void setLastName(String lastName) ... {
this .lastName = lastName;
}
public BigDecimal getPayment() ... {
return payment;
}
public void setPayment(BigDecimal payment) ... {
this .payment = payment;
}
@Override
public int hashCode() ... {
// TODO Auto-generated method stub
return super .hashCode();
}
@Override
public String toString() ... {
StringBuffer buf = new StringBuffer();
buf.append( " [ " );
buf.append( " employeeId= " + employeeId).append( " , " );
buf.append( " firstName= " + firstName).append( " , " );
buf.append( " lastName= " + lastName).append( " , " );
buf.append( " birthday= " + birthday).append( " , " );
buf.append( " payment= " + payment);
buf.append( " ] " );
return buf.toString();
}
}
Employee的complarator对象,他调用了ISortOrder来获得比较结果,这样我们就能够将具体的比较算法留到下层来实现,一旦Employe的比较规则改变,这个类也不需要在理会了.
/** */ /**
*
*/
package com.demo.sort;
import java.util.Comparator;
/** */ /**
* @author Administrator
*
*/
public class EmployeeComparator implements Comparator ... {
ISortOrder sortOrder;
public EmployeeComparator(ISortOrder sortOrder) ... {
this .sortOrder = sortOrder;
}
/**/ /* (non-Javadoc)
* @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
*/
public int compare(Object arg0, Object arg1) ... {
return sortOrder.compare(arg0,arg1);
}
}
/** */ /**
*
*/
package com.demo.sort;
/** */ /**
* @author Administrator
*
*/
public interface ISortOrder ... {
public int compare(Object arg0, Object arg1);
}
具体的排序规则对象,这个对象记录了Employee对象中具体属性的排序规则和属性类型,如果用户定义了多条规则那么没一条规则就应该对于一个实例.
/** */ /**
*
*/
package com.demo.sort;
/** */ /**
* @author Administrator
*
*/
public class EmployeeOrder ... {
public final static int _LONG = 0 ;
public final static int _STRING = 1 ;
public final static int _DATE = 2 ;
public final static int _BIGDECIMAL = 3 ;
private String propertyName;
private boolean isAsc;
private int dataType;
public EmployeeOrder(String propertyName, boolean isAsc, int dataType) ... {
this .propertyName = propertyName;
this .isAsc = isAsc;
this .dataType = dataType;
}
public boolean isAsc() ... {
return isAsc;
}
public void setAsc( boolean isAsc) ... {
this .isAsc = isAsc;
}
public String getPropertyName() ... {
return propertyName;
}
public void setPropertyName(String propertyName) ... {
this .propertyName = propertyName;
}
public int getDataType() ... {
return dataType;
}
public void setDataType( int dataType) ... {
this .dataType = dataType;
}
}
这里是重点,这个对象知道如何根据order规则来排序,comparator就是调用这个对象的compare方法来获得比较结果,由于 EmployeeOrder对象中定义了对象属性的排序方法,所以这个对象中使用的java的反射来获得具体属性值,并根据不同的属性类型进行比较,如果一共有3条比较规则,那么在比较2个Employee对象是先从第一个规则开始比较,如果比较出来一样,那么在进行第二个规则的比较,否则退出比较.由于本人很懒所以只对其中的一部分属性类型给出了比较方法,并没有实现所有数据类型的比较,大家可以自己实现,呵呵.
/** */ /**
*
*/
package com.demo.sort;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.util.List;
/** */ /**
* @author Administrator
*
*/
public class EmployeeSortOrder implements ISortOrder ... {
private List < EmployeeOrder > orders;
public EmployeeSortOrder(List < EmployeeOrder > orders) ... {
this .orders = orders;
}
public int compare(Object arg0, Object arg1) ... {
int result = 0 ;
try ... {
Employee e1 = (Employee) arg0;
Employee e2 = (Employee) arg1;
for (EmployeeOrder order : orders) ... {
Object v1 = getVaule(e1,order.getPropertyName());
Object v2 = getVaule(e2,order.getPropertyName());
result = sort(v1,v2,order.getDataType());
if ( ! order.isAsc()) ... {
result *=- 1 ;
}
if (result != 0 ) ... {
break ;
}
}
} catch (Exception e) ... {
// TODO: handle exception
}
return result;
}
private int sort(Object v1,Object v2, int dataType) ... {
int result = 0 ;
switch (dataType) ... {
case EmployeeOrder._STRING:
String s1 = (String)v1;
String s2 = (String)v2;
result = s1.compareTo(s2);
break ;
case EmployeeOrder._BIGDECIMAL:
BigDecimal d1 = (BigDecimal)v1;
BigDecimal d2 = (BigDecimal)v2;
result = d1.compareTo(d2);
break ;
case EmployeeOrder._LONG:
Long l1 = (Long)v1;
Long l2 = (Long)v2;
result = l1.compareTo(l2);
break ;
default :
result = 0 ;
break ;
}
return result;
}
private Object getVaule(Object obj,String propertyName) ... {
Object result = null ;
try ... {
Class clazz = obj.getClass();
Field field = clazz.getDeclaredField(propertyName);
field.setAccessible( true );
result = field.get(obj);
} catch (Exception e) ... {
e.printStackTrace();
}
return result;
}
}
没多说的,测试类.
package com.demo.sort;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import junit.framework.TestCase;
public class EmployeeSortTest extends TestCase ... {
private List < Employee > employeeList;
@Override
protected void setUp() throws Exception ... {
super .setUp();
Employee e;
Date date;
Calendar cal = Calendar.getInstance();
employeeList = new ArrayList < Employee > ();
for ( int i = 0 ;i < 10 ;i ++ ) ... {
e = new Employee();
if ( 0 == i % 3 )
cal.add(Calendar.DATE, 1 );
date = cal.getTime();
e.setBirthday(date);
e.setEmployeeId(Long.valueOf(i));
e.setFirstName( " firstName " + i / 2 );
e.setLastName( " LastName " + i * 3 );
e.setPayment( new BigDecimal(i % 3 ));
employeeList.add(e);
}
}
@Override
protected void tearDown() throws Exception ... {
super .tearDown();
}
public void testSort() ... {
List < EmployeeOrder > orders = new ArrayList < EmployeeOrder > ();
EmployeeOrder order = new EmployeeOrder( " firstName " , false ,EmployeeOrder._STRING);
orders.add(order);
order = new EmployeeOrder( " employeeId " , false ,EmployeeOrder._LONG);
orders.add(order);
ISortOrder sortOrder = new EmployeeSortOrder(orders);
EmployeeComparator comparator = new EmployeeComparator(sortOrder);
Collections.sort(employeeList,comparator);
for (Employee employee : employeeList) ... {
System.out.println(employee);
}
}
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/woshiliukui/archive/2009/07/28/4382885.aspx
发表评论
-
Errors running builder 'JavaScript Validator' on project '......'
2013-02-22 12:14 1007在编译java工程时,如果出现 “Errors occur ... -
list,set,map,数组间的相互转换
2012-09-29 13:53 1048list,set,map,数组间的相互转换 ... -
POI学习笔记(三)
2010-06-29 15:14 427314. 自定义颜色 HSSF: ... -
POI学习笔记(二)
2010-06-29 15:12 50397. 设置单元格的边框 Java代码 ... -
POI学习笔记(一)
2010-06-29 15:10 7395项目中经常要解析和生成Excel文件,最常用的开源组件有poi ... -
web.xml 配置详解
2010-05-27 11:07 1120在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似 ... -
如何调用hh.exe或者别的命令行的方式,在已经打开了的chm中,定位到指定页面?
2010-05-25 11:55 2160hh.exe mk:@MSITStore:F:\\buyord ... -
如何用一个按钮打开chm的帮助文件
2010-05-25 10:26 2132如果是在windows下运行的话,可以用Runtime的get ... -
java文件或jsp、xml文件注释
2010-01-13 16:29 1826Java用Shift+Ctrl+C(单行注释)没问题,Jsp页 ... -
对Java Serializable(序列化)的理解和总结
2010-01-12 09:05 10631、序列化是干什么的? ... -
基本数据类型转换
2010-01-06 09:42 1048int -> String int i=12345;S ... -
配置JDK
2009-12-18 15:07 1383下载好的JDK是一个可执 ... -
一个java处理JSON格式数据的通用类
2009-12-10 16:50 1241一个java处理JSON格式数据的通用类 进入需要在项目中用 ... -
JAVA注解
2009-12-04 08:33 2693java 注解 可以使用在类,方法,全局变量,局部变量作用: ... -
java对象排序
2009-11-18 09:46 1324Java集合对象排序测试 Java API针对集合类型排 ... -
java中对于复杂对象排序的模型及其实现
2009-11-18 09:41 1159排序是编程中经常要碰到的问题,如果只是一般的数据库数据那么我们 ...
相关推荐
在Java中动态实现二叉树,即在运行时根据需要创建、更新和操作树结构,这涉及到对数据结构和Swing组件的深入理解。 首先,二叉树是一种特殊的树形数据结构,每个节点最多有两个子节点,分别称为左孩子和右孩子。...
在“深度学习java及其算法详解”这一资源中,我们探讨的是如何将Java编程语言与深度学习技术相结合,以及深入理解基础的计算机科学概念,特别是数据结构和算法。Java是一种广泛应用于企业级应用、移动开发(如...
### Java线程内存模型的缺陷 #### Java内存模型(JMM)概述 Java作为一种高度抽象化的编程语言,致力于提供统一的内存管理模型,以便开发者能够跨平台地编写多线程程序。为此,Java引入了一个核心概念——Java内存...
5. **其他设计模式**:除了以上几种,还有Builder模式(用于复杂对象的构建),Prototype模式(用于复制或克隆对象),Decorator模式(用于动态地给对象添加职责),Facade模式(提供一个统一的接口,用来访问子系统...
3. **集合框架**:Java集合框架包括List、Set、Queue和Map等接口及其实现类。熟悉ArrayList、LinkedList、HashSet、HashMap等常见数据结构的特性和使用场景,是解决复杂问题的关键。 4. **多线程**:Java提供了强大...
在Java编程环境中实现PCA,可以有效地处理大数据集,减少计算复杂性,并帮助揭示数据中的主要结构。以下是对PCA算法及其Java实现的详细解释。 PCA的核心目标是找到原始数据的新坐标系,使得数据在新坐标系下的方差...
9. **算法与数据结构**:虽然Java面试不像算法竞赛那样注重复杂算法,但基础的数据结构(如栈、队列、树、图)和基础算法(如排序、查找)仍然是面试的常见话题。 10. **项目经验与问题解决能力**:面试官会关注...
### 使用Java实现数据库编程知识点详解 #### 一、数据库的设计 **1. 规范设计数据库的步骤** - **收集信息**:明确需求,包括业务流程、数据需求等。 - **标识实体**:识别出系统中需要存储的主要对象或概念。 - ...
9. **网络编程**:TCP/IP协议基础,Socket编程,HTTP/HTTPS协议的理解,以及如何在Java中实现网络通信。 10. **反射和注解**:反射允许在运行时检查类和对象,而注解提供了一种元数据的方式,面试中可能会讨论如何...
标题中的"mybatis自动生成Java实体类和映射文件的自动生成类工具"指的就是这样的一个辅助开发工具,它可以分析数据库表结构,并根据表信息自动生成对应的Java实体类和Mapper接口及其XML配置文件。 在Java开发中,...
- `abstract`:用来修饰类或方法,表示抽象类不能被实例化,抽象方法需要在子类中实现。 - **`final`、`finally`、`finalize`的区别**: - `final`:表示不可修改。 - `finally`:用于异常处理中,确保某段代码...
组合是将一个对象作为另一个对象的成员变量,实现复杂对象的构建。代理模式则提供了在运行时动态创建具有额外功能的对象的能力。 Java支持静态和final关键字。static用于声明类级别的成员,final用于声明不可改变的...
网状模型允许一个节点拥有多个父节点,形成复杂的网络结构。 #### Java虚拟机的角色 - **知识点**:Java虚拟机(JVM)负责解释执行Java字节码。JVM提供了平台无关性,使得Java程序可以在任何安装了JVM的操作系统上...
3. **集合框架**:Java集合框架包括List、Set、Queue、Map等接口及其实现类,如ArrayList、LinkedList、HashSet、HashMap等。理解它们的区别和使用场景,以及迭代器、泛型等概念,能有效提高代码的效率和可维护性。 ...
Java中的运算符按照优先级排序,由高到低分别为:括号`()`、逻辑非`!`、算术运算符、关系运算符、逻辑运算符、赋值运算符等。 ### 7. 不正确的Java表达式示例 给出的不正确Java表达式示例为: ```java int k = ...
5. **集合框架**:Java集合框架包括List、Set、Map接口及其实现类,如ArrayList、LinkedList、HashSet、HashMap等,理解它们的特性与应用场景至关重要。 6. **多线程**:Java中的Thread类和Runnable接口,线程同步...
3. **异常处理**:Java的异常处理机制通过try-catch-finally语句块实现,对于可能出现的错误情况进行捕获和处理,以保证程序的健壮性。 4. **集合框架**:Java集合框架包括List、Set、Map等接口,以及ArrayList、...
在Java集合框架中,`List`, `Set`和`Map`接口及其实现类就是装饰模式的应用。 11. **命令模式**:将请求封装为一个对象,从而可以使用不同的请求、队列请求、或者支持撤销操作。Java中,事件处理机制(如...
虽然Java面试不一定要求复杂的算法,但基础的排序、查找算法和常用数据结构(如链表、树、图、队列、栈)的理解和应用能力,是评估你解决问题能力的重要参考。 通过学习《Java面试宝典》,你将系统地掌握上述知识,...