Java 对不同类型对象的列表进行排序
我有一个对象列表,其中包含不同类型的对象,但所有对象中只有一个属性是通用的。 列表包含字段类、按钮类、页面类等对象,但有一个属性在所有属性中是通用的,即“序列号”&Java 对不同类型对象的列表进行排序,java,Java,我有一个对象列表,其中包含不同类型的对象,但所有对象中只有一个属性是通用的。 列表包含字段类、按钮类、页面类等对象,但有一个属性在所有属性中是通用的,即“序列号”& 我想根据“sequence\u no”对这个列表进行排序。我建议创建一个接口,类似于使用方法getSequenceNo()的“Sequenceable” 你的字段,按钮,页面类应该实现这个接口,getSequenceNo()方法将返回你的序列号 然后,您可以实现自己的比较器,并使用该比较器进行排序 例如,您的比较器将如下所示: cl
我想根据“sequence\u no”对这个列表进行排序。我建议创建一个接口,类似于使用方法
getSequenceNo()
的“Sequenceable
”
你的字段
,按钮
,页面
类应该实现这个接口,getSequenceNo()
方法将返回你的序列号
然后,您可以实现自己的比较器
,并使用该比较器进行排序
例如,您的比较器将如下所示:
class MyComparator implements Comparator<Sequenceable> {
@Override
public int compare(Sequenceable o1, Sequenceable o2) {
return o2.getSequenceNo() - o1.getSequenceNo();
}
}
如果有几个类需要排序(字段、按钮、页面…),则可以执行从
Comparator
继承的类,并在开关类规则中使用java.lang.Object.getClass()
和强制转换
比如:
public class MyComparator implements Comparator<Object>{
@Override
public int compare(Object o1, Object o2) {
int o1prop,o2prop;
switch (o1.getClass().toString()) {
case "java.Button":
((Button)o1prop).getSequence_no();
break;
default:
break;
}
switch (o2.getClass().toString()) {
case "java.Field":
((Field)o1prop).getSequence_no();
break;
default:
break;
}
return o1prop-o2prop;
}
所有对象都应该由某个相同的超类执行或继承,这样编译器就不会要求您显式地更改这些对象。最好且简洁的方法是让您的类实现一个接口或扩展一个公共基类 另一种方法是(出于性能、可读性和清洁度的考虑,我不喜欢becpz),创建一个自定义比较器,它使用反射来检查
键入并比较属性是否所有这些对象都有一个通用的超类?@David:根本没有继承。属性名是否为所有类的
序列号?@TDG:是的,这在所有类中都是通用的。如果他能更改所有类的声明,我认为这是最好的选择。
Collections.sort(list, new MyComparator());
public class MyComparator implements Comparator<Object>{
@Override
public int compare(Object o1, Object o2) {
int o1prop,o2prop;
switch (o1.getClass().toString()) {
case "java.Button":
((Button)o1prop).getSequence_no();
break;
default:
break;
}
switch (o2.getClass().toString()) {
case "java.Field":
((Field)o1prop).getSequence_no();
break;
default:
break;
}
return o1prop-o2prop;
}
Collections.sort(list, new MyComparator());