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;
/** */ /**
*
*/
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);
}
}
}
责任编辑:小草