以下是我的方法。它适用于比较字符串。我想使它能够比较日期或可能任何具有可接受定义的compareTo方法的类。寻找一种简单的方法来做到这一点。我正走在一条黑客的道路上。也欢迎任何其他改进此方法的建议。
protected <E> int compareFields(E o1, E o2,String fieldName){
String o1Data;
String o2Data;
try {
o1Data = (String) o1.getClass().getMethod(fieldName).invoke(o1);
o2Data = (String) o2.getClass().getMethod(fieldName).invoke(o2);
}
catch(Exception e) {
throw new RuntimeException(e);
}
if(o1Data == null && o2Data == null){
return 0;
} else if (o1Data == null){
return 1;
} else if (o2Data == null){
return -1;
}
return o2Data.compareTo(o1Data);
}
答案 0 :(得分:10)
为什么不使用Comparable<T>
,这正是出于此目的?
答案 1 :(得分:1)
你的意思是以下吗?
protected <E> int compareFields(E o1, E o2, String fieldName){
try {
Comparable o1Data = (Comparable) o1.getClass().getMethod(fieldName).invoke(o1);
Comparable o2Data = (Comparable) o2.getClass().getMethod(fieldName).invoke(o2);
return o1Data == null ? o2Data == null ? 0 : 1 :
o2Data == null ? -1 : o1Data.compareTo(o2Data);
} catch(Exception e) {
throw new RuntimeException(e);
}
}
我假设您不想反向排序数据。
答案 2 :(得分:0)
为什么不写一个ComparableComparator:
public class ComparableComparator implements Comparator<Comparable> {
public int compare( Comparable c1, Comparable c2 ) {
if( c1 == null && c2 != null ) {
return 1;
} else if( c1 != null && c2 == null ) {
return -1;
} else if( c1 == null && c2 == null ) {
return 0;
} else {
return c1.compare( c2 );
}
}
}
答案 3 :(得分:0)
使用Comparable类可能是一个更好的解决方案,但是在尝试转换为String之前还应该进行测试,而不是依赖于try-catch来获取逻辑流。
if (o1 instanceof String && o2 instanceof String){}
答案 4 :(得分:0)
请不要对这样的事情使用反射!!
为方法提供合适的Comparator
,或提取相关属性的方法(可能以原始类型不支持的方式计算),或两者兼而有之。