使用比较器返回具有最大值的对象

时间:2013-05-16 09:26:33

标签: java object collections comparator

假设我们有一个名为Contract的Java类型,它代表业务合同。之间 类Contract中的方法标题如下:

public Date finish()

返回一个表示合同完成日期的对象。

public void update(Date d)

更改调用它的对象的状态 表示在参数给出的日期之后适用的合同条款的变化。

public int payment(Date d)

返回截止日期作为参数的付款, 这将始终是一个大于0的整数。

public Set<Contract> subcontracts()

返回一个代表所有的集合 由调用此方法的对象表示的契约的子转换。

其中一个问题是:

  

写一个实例方法进入类名为maximumPayment的类。当调用代表合同的对象时,   此方法应采用Date参数并返回表示形式   无论哪个分包合约都有最大的付款日期   给出。如果合同没有分包合同,那么对象就是   调用方法应该返回。

我的第一个问题是我无法弄清楚如何使用max value返回Contract对象..如果合同没有转包,则应该返回调用该方法的对象...

这是我到目前为止所拥有的...但它不喜欢我从内部类调用方法支付:

public Contract biggestPayment(Date d)
{

List<Contract> clist = new ArrayList<Contract>(subc);
Collections.sort(clist, new Comparator<Contract>() 
{
       public int compare(Contract c1, Contract c2) 
       {
          c1.payment(d).compareTo(c2.payment(d));
       }
});


 .......
}

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

Date d参数必须是最终的才能在匿名子类中使用它。

public Contract biggestPayment(final Date d) {

另外,请务必在compare()上调用Integer方法,而不是int s。作为int原始类型,您无法在其上调用任何方法。你可以将它们包装在Integer中并调用compare,或者自己比较int并根据Comparator#compare()的合同返回结果。

请记住,在匿名子类中使用外部作用域的局部变量需要变量为final。原因如下:Why are only final variables accessible in anonymous class?

该变量将作为对子类的引用有效地传入。

所以,这样做:

final Date d;
new Comparator<Contract>() {
    public int compare(Contract c1, Contract c2) {
        c1.payment(d).compareTo(c2.payment(d));
    }
};

大致相当于

Date d;
new MyComparator(d);

private final class MyComparator implements Comparator<Contract> { 
    Date dueDate;
    public MyComparator(Date aDate) {
        this.dueDate = aDate;
    }
    public int compare(Contract c1, Contract c2) {
        c1.payment(dueDate).compareTo(c2.payment(dueDate));
    }
}