Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用多个条件对ArrayList排序_Java_Sorting_Arraylist - Fatal编程技术网

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
    B
    。这样,如果您首先按年龄排序,当您再次按城市排序时,两个元素具有相同的城市,它们的相对顺序将由输入顺序决定,因此它们将按年龄排序。/li li使用比较函数执行单个排序,该函数表示codeAB.age

请注意,Java的
Collections.sort
保证是稳定的,因此选择更适合您需要的策略。

您有两个基本相同的选项:

  • 使用a执行两种排序:首先按年龄,然后按城市。稳定排序算法是一种排序算法,如果两个元素在当前的
    函数下相等,则保持它们的相对顺序
    A
    B
    。这样,如果您首先按年龄排序,当您再次按城市排序时,两个元素具有相同的城市,它们的相对顺序将由输入顺序决定,因此它们将按年龄排序。/li li使用比较函数执行单个排序,该函数表示codeAB.age

请注意,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的解决方案