如何使用2个int参数对ArrayList进行排序?

时间:2015-03-18 02:39:03

标签: java sorting arraylist

我想对Process对象的arraylist进行排序。进程有2个参数:startTime和duration。我想在startTime中按升序对arraylist进行排序,对于相同的startTime,我想按持续时间的升序排序。我该怎么做?

2 个答案:

答案 0 :(得分:1)

首先,我假设您的Process类看起来像这样(加上其他东西):

public class Process{
   private int startTime;
   private int duration;

   public int getStartTime(){
       return startTime;
   }

   public int getDuration(){
       return duration;
   }
}

第一个选择,&#34;默认&#34;进程的排序方法是你所说的方法(首先是startTime升序,然后是持续时间升序),你可以制作流程工具Comparable<Process>

public class Process implements Comparable<Process>{
   private int startTime;
   private int duration;

   public int compareTo(Process other){
       if(startTime < other.startTime) return -1;
       if(startTime > other.startTime) return 1;
       //If here, startTime == other.startTime
       if(duration < other.duration) return -1;
       if(duration > other.duration) return 1;
       return 0;
    }
}

然后您可以使用简单方法对ArrayList<Process>进行排序:

ArrayList<Process> a = new ArrayList<Process>();

//Fill up a with process instances

Collections.sort(a); //Sorts according to the compareTo method in Process.

但是,如果这不是分类流程的默认方法,(或者您无法使流程实现可比较,那么您将需要定义一个自定义Comparator<Process>如下:

class ProcessComparator implements Comparator<Process>{
    public int compare(Process p1, Process p2){
       if(p1.getStartTime() < p2.getStartTime()) return -1;
       if(p1.getStartTime() > p2.getStartTime()) return 1;
       //If here, p1.startTime == other.startTime
       if(p1.getDuration() < p2.getDuration()) return -1;
       if(p1.getDuration() > p2.getDuration()) return 1;
       return 0;
    }
}

然后,使用一个:

ArrayList<Process> a = new ArrayList<Process>();

//Fill up a with process instances

Collections.sort(a, new ProcessComparator()); //Sorts according to the compareTo method in Process.

答案 1 :(得分:0)

您可以创建自定义Comparator

或者您可以创建可重复使用的比较器来帮助进行未来的排序。例如,您可以使用Bean Comparator,它允许您对Process对象的属性进行排序。该链接包含使用BeanComparator或创建自定义Comparator的示例代码。

然后,您可以使用Group Comparator,它允许您同时对多个属性进行排序。