使用多个条件对ArrayList进行排序

时间:2016-12-30 21:34:41

标签: java sorting arraylist

说我有一个数组列表echo preg_replace_callback("/\"([^\"]*)\":/", function($m){ return str_replace("-", "_", $m[0]); }, $jsonStr);

myObject类看起来像:

MyArrayList<MYObject>

我的虚拟数据如下所示:

public class myObject
{
      String name;
      Int age;
      String : city;
}

现在我想按此顺序对 myArraylist (其中包含上述数据)进行排序 -

name : martin ,  age : 20 , city : NY
name : felix ,  age : 19 , city : LA
name : brian ,  age : 21 , city : NY
name : brian ,  age : 19 , city : NY

你可以看到上面的数据分为两种方式 - 首先是城市,然后是年龄,所以这就是我想做的事情,我想要排序按顺序排列arrayList然后我想通过保持第一顺序排序另一个顺序

任何人都知道我该怎么做?那么请让我知道

如果我的问题不够明确,请告诉我我会解决它

3 个答案:

答案 0 :(得分:2)

您有两种选择,基本上是等价的:

  • 使用stable sort algorithm执行两种排序:首先是年龄,然后是城市。稳定排序算法是一种排序算法,如果它们在当前A函数下是等价的,则保持两个元素B<的相对顺序。这样,如果您首先按年龄排序,当您按城市再次排序并且两个元素具有相同的城市时,它们的相对顺序将由输入顺序确定,因此它们将按年龄排序。
  • 使用比较功能执行单一排序,该功能在A < BA.city != B.city && A.city < B.city时显示A.city = B.city && A.age > B.age

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

答案 1 :(得分:2)

首先,类应具有描述性名称,类名应以大写字符开头。所以我打电话给你的班级人员

您需要创建一个自定义Comparator以供排序实用程序使用。

对于可重复使用的解决方案,您可以使用Bean ComparatorGroup Comparator

  1. BeanComparator允许您对对象中的任何属性进行排序

  2. GroupComparator允许您将多个Comparator合并为一个Comparator

  3. 所以基本逻辑是:

    BeanComparator city = new BeanComparator(Person.class, "getCity");
    BeanComparator age = new BeanComparator(Person.class, "getAge");
    GroupComparator gc = new GroupComparator(city, age);
    Collections.sort(arrayList, gc);
    

答案 2 :(得分:2)

您可以创建比较器,首先按城市进行比较,然后按年龄进行比较。像这样:

getSymbol2

修改

我使用&#34; compareTo&#34; Integer类的方法,您不能在<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> <div id ="mainContent"> <form action="https://s3.amazonaws.com/{!awsKeySet.Name}" method="post" enctype="multipart/form-data" id="uploadForm"> <input type="hidden" name="key" id="key" /> <input type="hidden" name="AWSAccessKeyId" value="{!awsKeySet.AWS_AccessKey_Id__c}" /> <input type="hidden" name="policy" value="{!policy}" /> <input type="hidden" name="signature" value="{!signedPolicy}" /> <input type="hidden" name="acl" value="{!acessType}" /> <input type="hidden" name="Content-Type" value="{!Content_Type}" /> <!--input type="hidden" name="success_action_status" value="201" /--> <!--input type="hidden" name="success_action_redirect" value="{!ForRedirect}" /--> <h4 class="fileToUpload">Select a File to Upload in AWS</h4><br /> <div class="row"> <input type="file" size="50" name="file" id="file" /> </div> <div id="fileName"></div> <div id="fileSize"></div> <div id="fileType"></div> <div class="row"> <input type="submit" value="Upload" id="btn_submit" /> </div> <div id="progressNumber"></div> </form> </div> <script> $(document).ready(function () { var _requestBucket; $("#btn_submit").click(function(event){ //alert(1); event.preventDefault(); var _file; _file = $("#file").val().replace(/.+[\\\/]/, ""); console.log('_file '+ _file); $("#key").val(_file); $("#uploadForm").submit(); }); }); </script> 基元类型上调用它。如果您使用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); 作为年龄,您可以写出if语句进行比较。