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());