【问题标题】:Java - order things in an arraylist according to an atributeJava - 根据属性对数组列表中的事物进行排序
【发布时间】:2015-09-06 17:36:09
【问题描述】:

嗨,我有一个数组列表,让我们在该数组列表中将其称为“callcenterList”,我将添加“Call”类的对象。

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

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

所以一个“呼叫”对象就像:
call1:
Atribute1 = whatever.
Atribute2 = whatever.
Month = 3
Day = 25
Status = Pending

这就是我要求做的事情:

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

【问题讨论】:

  • 只存储Call 的月份和日期(不包括年份)会使按日期排序不明确。考虑为此目的仅使用一个 Date 变量。
  • 试用Comparator 接口。创建一个实现Comparator<Call> 的新类。然后编写一个方法,将您的对象与您喜欢的方法进行比较。然后拨打Collections.sort(yourList, yourComparator);
  • 它看起来像是来自数据库的数据,如果是这种情况,那么让数据库完成这项工作(纯排序和过滤时间)=> SQL 将是最简单和最高效的。

标签: java sorting arraylist


【解决方案1】:

您可以使用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());
      }
   }

}

【讨论】:

    【解决方案2】:

    在 ArrayList 上调用 sort(new CallComparator()),并将 comparator 传递给它。然后将根据比较器给出的排序对列表进行排序。如果调用 #14 发生在调用 #7 之前,则 new 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());
    

    这将达到同样的效果。

    【讨论】:

      【解决方案3】:

      听起来您想过滤结果而不是排序。虽然您可以通过首先对其进行排序,然后使用 Iterator 删除您不关心的元素来完成此操作,但与仅过滤它相比,这样做需要做更多的工作。

      请注意,如果这来自数据库,则在数据库端对其进行过滤。根据数据量,在后端执行此类操作的成本要比在后端执行的成本更高在服务器上做。

      使用Google Guava,这很简单。

      • 使用FluentIterable 创建一个可迭代对象,然后您可以将操作链接到该对象。
      • 创建一个Predicate,仅接受符合您关心的参数的项目。
      • 使用Comparator 按您想要的顺序对结果列表进行排序。请记住,这与 Comparable 不同,在 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());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-11
        • 1970-01-01
        • 2021-06-27
        • 2012-11-12
        • 1970-01-01
        • 2014-08-21
        • 1970-01-01
        相关资源
        最近更新 更多