Java 使用多个条件对ArrayList排序
假设我有一个数组列表Java 使用多个条件对ArrayList排序,java,sorting,arraylist,Java,Sorting,Arraylist,假设我有一个数组列表MyArrayList myObject类看起来像: public class myObject { String name; Int age; String : city; } 我的虚拟数据如下所示: name : martin , age : 20 , city : NY name : felix , age : 19 , city : LA name : brian , age : 21 , city : NY name :
MyArrayList
myObject类看起来像:
public class myObject
{
String name;
Int age;
String : city;
}
我的虚拟数据如下所示:
name : martin , age : 20 , city : NY
name : felix , age : 19 , city : LA
name : brian , age : 21 , city : NY
name : brian , age : 19 , city : NY
现在我想按以下顺序对myArraylist(其中包含上述数据)进行排序-
name : felix , lastname : 19 , city : LA
name : brian , lastname : 21 , city : NY
name : martin , lastname : 20 , city : NY
name : brian , lastname : 19 , city : NY
正如你所看到的,上面的数据是按两种方式排序的-首先是按城市排序,然后再按年龄排序,这就是我要做的,我想按顺序排序一个数组列表,然后我想按另一个顺序排序,保持第一个顺序
有人知道我怎么做吗??那么请告诉我
如果我的问题不够清楚,请告诉我,我会解决它。您有两个基本相同的选项:
- 使用a执行两种排序:首先按年龄,然后按城市。稳定排序算法是一种排序算法,如果两个元素在当前的
函数下相等,则保持它们的相对顺序
和A
。这样,如果您首先按年龄排序,当您再次按城市排序时,两个元素具有相同的城市,它们的相对顺序将由输入顺序决定,因此它们将按年龄排序。/li li使用比较函数执行单个排序,该函数表示codeAB.ageB
请注意,Java的
Collections.sort
保证是稳定的,因此选择更适合您需要的策略。您有两个基本相同的选项:
- 使用a执行两种排序:首先按年龄,然后按城市。稳定排序算法是一种排序算法,如果两个元素在当前的
函数下相等,则保持它们的相对顺序
和A
。这样,如果您首先按年龄排序,当您再次按城市排序时,两个元素具有相同的城市,它们的相对顺序将由输入顺序决定,因此它们将按年龄排序。/li li使用比较函数执行单个排序,该函数表示codeAB.ageB
请注意,Java的
集合.sort
保证是稳定的,因此请选择更适合您需要的策略。首先,类应具有描述性名称,并且类名称应以大写字符开头。所以我会给你们班的人打电话
您需要创建一个自定义的比较器
,以供排序实用程序使用
对于可重用的解决方案,您可以使用和
BeanComparator
允许您对对象中的任何属性进行排序GroupComparator
允许您将多个比较器
组合成一个比较器
BeanComparator city = new BeanComparator(Person.class, "getCity");
BeanComparator age = new BeanComparator(Person.class, "getAge");
GroupComparator gc = new GroupComparator(city, age);
Collections.sort(arrayList, gc);
首先,类应该有一个描述性名称,类名称应该以大写字符开头。所以我会给你们班的人打电话 您需要创建一个自定义的
比较器
,以供排序实用程序使用
对于可重用的解决方案,您可以使用和
BeanComparator
允许您对对象中的任何属性进行排序GroupComparator
允许您将多个比较器
组合成一个比较器
BeanComparator city = new BeanComparator(Person.class, "getCity");
BeanComparator age = new BeanComparator(Person.class, "getAge");
GroupComparator gc = new GroupComparator(city, age);
Collections.sort(arrayList, gc);
您可以创建一个比较器,首先按城市进行比较,然后按年龄进行比较。大概是这样的:
Comparator<MyObject> comparator = new Comparator<MyObject>(){
@Override
public int compare(final MyObject o1, final MyObject o2){
if(!o1.getCity().equals(o2.getCity())){
return o1.getCity().compareTo(o2.getCity());
}else{
return o1.getAge().compareTo(o2.getAge());
}
}
};
Collections.sort(myArrayList,comparator);
比较器比较器=新比较器(){
@凌驾
公共整数比较(最终MyObject o1,最终MyObject o2){
如果(!o1.getCity().)等于(o2.getCity()){
返回o1.getCity().compareTo(o2.getCity());
}否则{
返回o1.getAge().compareTo(o2.getAge());
}
}
};
Collections.sort(myArrayList,comparator);
编辑:
我使用了Integer类的“compareTo”方法,不能在
int
原语类型上调用该方法。如果你用int
表示年龄,你可以写一个If语句进行比较 您可以创建一个比较器,首先按城市进行比较,然后按年龄进行比较。大概是这样的:
Comparator<MyObject> comparator = new Comparator<MyObject>(){
@Override
public int compare(final MyObject o1, final MyObject o2){
if(!o1.getCity().equals(o2.getCity())){
return o1.getCity().compareTo(o2.getCity());
}else{
return o1.getAge().compareTo(o2.getAge());
}
}
};
Collections.sort(myArrayList,comparator);
比较器比较器=新比较器(){
@凌驾
公共整数比较(最终MyObject o1,最终MyObject o2){
如果(!o1.getCity().)等于(o2.getCity()){
返回o1.getCity().compareTo(o2.getCity());
}否则{
返回o1.getAge().compareTo(o2.getAge());
}
}
};
Collections.sort(myArrayList,comparator);
编辑:
我使用了Integer类的“compareTo”方法,不能在
int
原语类型上调用该方法。如果你用int
表示年龄,你可以写一个If语句进行比较 使用orderby…这是一种稳定的排序,因此第二次排序时,它将保留第一次排序的顺序。您的意思是我应该进行第一次排序,然后在第二次排序时,我必须使用orderby
??是的,这将根据java工作。集合的默认排序是稳定的,因此您可以只进行两次排序,它应该可以做到这一点。我很快看了一眼,认为这是c。使用orderby…这是一种稳定的排序,所以第二次排序时,它将保留第一次排序的顺序。你的意思是我应该进行第一次排序,然后在第二次排序时,我必须使用orderby
??是的,这将根据java工作。集合的默认排序是稳定的,因此你可以加倍排序,它应该会起作用。我很快瞥了一眼,以为是c#。BeanComparator
和GroupComparator
是两个依靠反射来完成工作的外部类。谈到工程…@akappa,只有BeanComparator依赖于反射。这两个类的重点是研究reusa的解决方案