尝试使我的Java方法通用,以便它可以比较字符串或日期
下面是我的方法。它可以很好地用于比较字符串。我想让它也能够比较日期,或者任何具有可接受定义的compareTo方法的类。寻找一个简单的方法来做到这一点。我正走在一条崎岖不平的小路上。也欢迎任何其他改进此方法的建议尝试使我的Java方法通用,以便它可以比较字符串或日期,java,Java,下面是我的方法。它可以很好地用于比较字符串。我想让它也能够比较日期,或者任何具有可接受定义的compareTo方法的类。寻找一个简单的方法来做到这一点。我正走在一条崎岖不平的小路上。也欢迎任何其他改进此方法的建议 protected <E> int compareFields(E o1, E o2,String fieldName){ String o1Data; String o2Data; try { o1Data = (String)
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听起来是个好主意。这是我第一次使用反射。那么你能告诉我在这种情况下使用反射有什么问题吗?