试图使我的Java方法通用,以便它可以比较字符串或日期

时间:2012-01-13 17:11:35

标签: java

以下是我的方法。它适用于比较字符串。我想使它能够比较日期或可能任何具有可接受定义的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);
}

5 个答案:

答案 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,或提取相关属性的方法(可能以原始类型不支持的方式计算),或两者兼而有之。