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

尝试使我的Java方法通用,以便它可以比较字符串或日期,java,Java,下面是我的方法。它可以很好地用于比较字符串。我想让它也能够比较日期,或者任何具有可接受定义的compareTo方法的类。寻找一个简单的方法来做到这一点。我正走在一条崎岖不平的小路上。也欢迎任何其他改进此方法的建议 protected <E> int compareFields(E o1, E o2,String fieldName){ String o1Data; String o2Data; try { o1Data = (String)

下面是我的方法。它可以很好地用于比较字符串。我想让它也能够比较日期,或者任何具有可接受定义的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);
}
protected int compareFields(E o1、E o2、字符串字段名){
字符串O1数据;
字符串O2数据;
试试{
o1Data=(字符串)o1.getClass().getMethod(字段名).invoke(o1);
o2Data=(字符串)o2.getClass().getMethod(fieldName).invoke(o2);
}
捕获(例外e){
抛出新的运行时异常(e);
}
如果(o1Data==null&&o2Data==null){
返回0;
}else if(o1Data==null){
返回1;
}else if(o2Data==null){
返回-1;
}
返回o2Data.compareTo(o1Data);
}

为什么不使用
可比
,这正是为了这个目的?

为什么不使用
可比
,这正是为了这个目的?

为什么不编写一个可比比较器:

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 );
        }
    }
}
公共类ComparableComparator实现Comparator{
公共整数比较(可比c1,可比c2){
如果(c1==null&&c2!=null){
返回1;
}else如果(c1!=null&&c2==null){
返回-1;
}else if(c1==null&&c2==null){
返回0;
}否则{
返回c1。比较(c2);
}
}
}

为什么不编写一个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 );
        }
    }
}
公共类ComparableComparator实现Comparator{
公共整数比较(可比c1,可比c2){
如果(c1==null&&c2!=null){
返回1;
}else如果(c1!=null&&c2==null){
返回-1;
}else if(c1==null&&c2==null){
返回0;
}否则{
返回c1。比较(c2);
}
}
}

使用可比较的类可能是更好的解决方案,但是您还应该在尝试转换为字符串之前进行测试,而不是依赖try-catch来实现逻辑流


if(o1 instanceof String&&o2 instanceof String){}

使用可比较的类可能是更好的解决方案,但是您还应该在尝试转换为字符串之前进行测试,而不是依赖try-catch进行逻辑流


如果(o1 instanceof String&&o2 instanceof String){}

您的意思是像下面这样吗

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);
    }
}
protected int compareFields(E o1、E o2、字符串字段名){
试试{
可比o1Data=(可比)o1.getClass().getMethod(fieldName).invoke(o1);
Compariable o2Data=(Compariable)o2.getClass().getMethod(fieldName).invoke(o2);
返回o1Data==null?o2Data==null?0:1:
o2Data==null?-1:o1Data.compareTo(o2Data);
}捕获(例外e){
抛出新的运行时异常(e);
}
}

我假设您不想对数据进行反向排序。

您的意思是像下面这样吗

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);
    }
}
protected int compareFields(E o1、E o2、字符串字段名){
试试{
可比o1Data=(可比)o1.getClass().getMethod(fieldName).invoke(o1);
Compariable o2Data=(Compariable)o2.getClass().getMethod(fieldName).invoke(o2);
返回o1Data==null?o2Data==null?0:1:
o2Data==null?-1:o1Data.compareTo(o2Data);
}捕获(例外e){
抛出新的运行时异常(e);
}
}

我假设您不想对数据进行反向排序。

请不要对此类内容使用反射


请为该方法提供合适的
比较器,或者提供提取相关属性的方法(可能以原始类型不支持的方式计算),或者同时提供这两种方法。

请不要对此类内容使用反射


为方法提供合适的
比较器
,或提取相关属性的方法(可能以原始类型不支持的方式计算),或两者兼而有之。

执行任何操作,但在执行任何操作之前,请参见,if else子句返回的值与compareTo()函数返回的值完全相同。从广义上讲,这可能会产生意想不到的结果。你也要注意那东西。RegardsDo what ever,但在执行任何操作之前,请确保从if else子句返回的值与从compareTo()函数返回的值完全相同。从广义上讲,这可能会产生意想不到的结果。你也要注意那东西。RegardsHawtin听起来是个好主意。这是我第一次使用反射。那么你能告诉我在这种情况下使用反射有什么问题吗?Hawtin听起来是个好主意。这是我第一次使用反射。那么你能告诉我在这种情况下使用反射有什么问题吗?