Java - 根据属性在arraylist中排序

时间:2015-06-21 00:18:15

标签: java sorting arraylist

嗨,我有一个arraylist,让我们在那个arraylist中称它为“callcenterList”,我将添加“Call”类的对象。

“呼叫”对象具有不同的属性,其中一些是“状态”,“月”和“日”(收到呼叫的月份和日期以及状态)。

状态可以是“已完成”或“待处理”

所以“调用”对象就像:

call1:
Atribute1 = whatever.
Atribute2 = whatever.
Month = 3
Day = 25
Status = Pending

所以这就是我要求做的事情:

我需要显示状态=待定的所有呼叫,并按日期排序。 我怎样才能做到这一点?如果您需要更多信息或更详细,请告诉我。 谢谢!

3 个答案:

答案 0 :(得分:3)

您可以使用Comparator<Call>类执行此操作,compare(Call c1, Call c2)方法比较两个参数的感兴趣属性,然后根据比较结果返回1,0或-1。然后,您可以使用Collections.sort(myList, myComparator)根据比较器对您的收藏品进行排序。

public class Call {
   private int value1;
   private int value2;
   public Call(int value1, int value2) {
      this.value1 = value1;
      this.value2 = value2;
   }
   public int getValue1() {
      return value1;
   }
   public void setValue1(int value1) {
      this.value1 = value1;
   }
   public int getValue2() {
      return value2;
   }
   public void setValue2(int value2) {
      this.value2 = value2;
   }
}

public class MyComparator implements Comparator<Call> {

   @Override
   public int compare(Call c1, Call c2) {
      int firstCompare = Integer.compare(c1.getValue1(), c2.getValue1());
      if (firstCompare != 0) {
         return firstCompare;
      } else {
         return Integer.compare(c1.getValue2(), c2.getValue2());
      }
   }

}

答案 1 :(得分:1)

在ArrayList上调用sort(new CallComparator()),并将comparator传递给它。然后根据比较器提供的矿石对列表进行分类。如果在调用#7之前调用#14,则新的CallComparator()。compare(call14,call7)将返回小于0的值。

所以,对于你给我们的数据,比较器可能是这样实现的:

public class CallComparator implements Comparator<Call> {
   @Override
   public int compare(Call c1, Call c2) {
        if (c1.getMonth() == c2.getMonth() 
             return c1.getDay() - c2.getDay();
        else 
             return c1.getMonth() - c2.getMonth();
        }
 }

这当然假设您在Call类中有getDay()和getMonth()方法。

如果你想在现实中这样做,你可能也希望用年份保存日期。您可以这样做,并启动compare() - 方法体并检查年份。但这将重新发明轮子。类Date已经在Java中存在了一段时间,但是Java 8引入了非常简洁的time-package,建议使用它。出于您的目的,您可以创建LocalDateTime对象(如果您跨时区操作,则创建Instant对象)以保存完整日期。然后,您可以简单地将compare()的主体更改为

return c1.getDate().compareTo(c2.getDate());

这将实现同样的目标。

答案 2 :(得分:0)

听起来你想过滤你的结果而不是订购它们。虽然您可以通过首先对其进行排序来完成此操作,然后使用Iterator删除您不关心的元素,这样做还有很多工作要做,而不仅仅是过滤它。

请注意,如果这是来自数据库,则在数据库端过滤它。根据数据量的不同,这样的操作在后端比在后端更昂贵在服务器上做。

使用Google Guava,这很简单。

  • 使用FluentIterable创建一个可迭代的,然后可以将操作链接到。
  • 创建一个Predicate,只接受符合您所关注参数的项目。
  • 使用Comparator按所需顺序对结果列表进行排序。请记住,这与Comparable不同,您可以在其中标记特定对象; Comparator允许您指定与自然排序不同的新排序。

这是一个例子。假设Call有方法getStatus()getDate(),而getDate()Comparablejava.util.Date类是)。

List<Call> calls = ...
final List<Call> filteredCalls = FluentIterable.from(calls).filter(new Predicate<Call>() {
    @Override
    public boolean apply(final Call input) {
        return "pending".equals(input.getStatus());
    }
 }).toSortedList(new Comparator<Call>() {
    @Override
    public int compare(final Call firstCall, final Call secondCall) {
        return firstCall.getDate().compareTo(secondCall.getDate());
    }
 });

在Java 8中,这个表达式变得更加简洁,并且您不需要使用第三方库。

final List<Call> filteredCalls = calls.stream()
                                .filter(c -> "pending".equals(c.getStatus()))
                                .sorted((left, right) -> left.getDate().compareTo(right.getDate()))
                                .collect(Collectors.toList());