java - 比较一个数组列表中的差异对象

标签 java object arraylist collections compare

需要帮助。创建了 arraylist,然后添加多个对象(在我的例子中,在 arraylist 中添加 2 种类型的对象)。然后对 arraylist 中的每个对象进行排序。能够排序,但我认为我的编码太长了。他们有什么办法吗?或者简单有效的方法。希望大家能帮忙。就这些,希望大家能帮忙。谢谢。

public class Sample {


    static ArrayList<Object> object = new ArrayList<>();

    public static void main(String[] args){


        //initialize object
        User user1 = new User("user1","1");
        User user2 = new User("user1","3");
        Staff staf1 = new Staff("staf1","2");
        Staff staf2 = new Staff("staf2","4");

        //add object to arraylist
        object.add(user1);
        object.add(user2);
        object.add(staf1);
        object.add(staf2);


        //sort
        Collections.sort(object,new Comparator<Object>() {
            Object one,two;

            @Override
            public int compare(Object o1, Object o2) {

                User user1,user2;
                Staff staf1,staf2;

                ///identify ol class
                if(o1 instanceof User){
                   user1 = (User) o1;
                   one = (Object) user1;
                }else if(o1 instanceof Staff){
                    staf1 = (Staff) o1;
                    one = (Object) staf1;
                }

                //identify o2 class
                if(o2 instanceof User){
                     user2 = (User) o2;
                     two = (Object) user2;

                }else if(o2 instanceof Staff){
                    staf2 = (Staff) o2;
                    two = (Object) staf2;
                }

                //identify each object class
                //then compare value
                if(one instanceof User && two instanceof User){
                    //execute process
                    User userOne = (User) one;
                    User userTwo = (User) two;
                    return userOne.getRegister().compareTo(userTwo.getRegister());

                }else if(one instanceof Staff && two instanceof Staff){
                     //execute process
                    Staff stafOne = (Staff) one;
                    Staff stafTwo = (Staff) two;
                    return stafOne.getRegister().compareTo(stafTwo.getRegister());

                }else if(one instanceof User && two instanceof Staff){
                     //execute process 
                    User userOne = (User) one;
                    Staff stafTwo = (Staff) two;
                     return userOne.getRegister().compareTo(stafTwo.getRegister());
                }else if(one instanceof Staff && two instanceof User){
                     //execute process
                    Staff stafOne = (Staff) one;
                    User userTwo = (User) two;
                    return  stafOne.getRegister().compareTo(userTwo.getRegister());
                }else{
                    return 0;
                }
            }

        });

        //display item
        for(Object object : object){   
           if(object instanceof User){
               User user = (User)object;
               //display data
               System.out.println(user.getRegister());
           }else if(object instanceof Staff){
               Staff staf = (Staff) object;
               //display data
               System.out.println(staf.getRegister());
           }
        }


    }
}

最佳答案

由于您的对象具有相同的字段和方法,我建议您使用 inheritance int这种情况。首先,您必须排除一个抽象类,它是您的两个类的父类:

public abstract class Parent implements Comparable<Parent> { 

    abstract Integer getRegister();

    @Override
    public int compareTo(final Parent parent) {
        return this.getRegister().compareTo(parent.getRegister());
    }

}

然后你必须创建你的类(class) UserStaff将延长Person类(class)。然后,您可以创建列表:List<Parent> list并通过它自己的比较器对其进行排序。因此,假设有可用的匹配构造函数,User extends ParentStaff extends Parent :

final List<Parent> list = new ArrayList<>();
list.add(new User("user1","1"));
list.add(new User("user1","3"));
list.add(new Staff("staf1","2"));
list.add(new Staff("staf2","4"));
Collections.sort(list);

编辑(因为OP不想使用继承):

与其检查几次,不如只检查一次,并在您了解类型时立即获取寄存器字段。

@Override
public int compare(Object o1, Object o2) {
    Integer register1 = null;
    Integer register2 = null;

    if(o1 instanceof User) {
        register1 = ((User)o1).getRegister();
    } else if(o1 instanceof Staff) {
        register1 = ((Staff)o1).getRegister();
    }

    if(o2 instanceof User) {
        register2 = ((User)o2).getRegister();
    } else if(o1 instanceof Staff) {
        register2 = ((Staff)o2).getRegister();
    }

    if(register1 != null && register2 != null) {
        return register1.compareTo(register2);
    }
    return 0;
}

关于java - 比较一个数组列表中的差异对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45648102/

相关文章:

java - 在部署到 PaaS (Cloud Foundry) 之前扫描 jar 文件

java - 如何在按回或打开 Activity 时隐藏滑动菜单

javascript - 定义对象后在对象上定义函数

java - 不明白为什么我不能将数据追加到 ArrayList 的末尾?

Java:我应该使用什么类型作为可调整大小的基元列表?

java - 删除水平进度条中的填充

java - 如何使用 DOM 在 XML 文档中添加文档类型

c# - Json.Net 根据值选择对象

javascript - 从自身内部访问当前对象

java - 如何从 Java/Android 中的另一个类获取 ArrayList 中存储的数据?