需要帮助。创建了 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) User
和Staff
将延长Person
类(class)。然后,您可以创建列表:List<Parent> list
并通过它自己的比较器对其进行排序。因此,假设有可用的匹配构造函数,User extends Parent
和Staff 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/