嗨,我有一个arraylist,让我们在那个arraylist中称它为“callcenterList”,我将添加“Call”类的对象。
“呼叫”对象具有不同的属性,其中一些是“状态”,“月”和“日”(收到呼叫的月份和日期以及状态)。
状态可以是“已完成”或“待处理”
所以“调用”对象就像:
call1:
Atribute1 = whatever.
Atribute2 = whatever.
Month = 3
Day = 25
Status = Pending
所以这就是我要求做的事情:
我需要显示状态=待定的所有呼叫,并按日期排序。 我怎样才能做到这一点?如果您需要更多信息或更详细,请告诉我。 谢谢!
答案 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()
是Comparable
(java.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());