为了实现分类,要求被分类的对象可以或多或少地相互比较。换句话说,定义一个规则,该规则将允许任何两个对象指示给定上下文中的哪个对象更早,哪个位置更晚。
在Java中,这些规则是在对象所属的类级别定义的。例如,让我们看一个描述用户帐户的类:
UserAccount {
currency
value
updatedTimestamp
}
根据上下文,可以根据不同规则比较用户帐户,例如:
在应用程序中,用户将看到按货币然后按值排序的帐户;
在管理面板中,所有用户帐户均按修改日期排序。
要在Java中或多或少地实现比较,有两种可能性:
UserAccount实现此接口,
Comparable<UserAccount>
在这种情况下,两个对象可以相互比较:acc1.compareTo(acc2)
创建一个单独的类来实现interface
Comparator<UserAccount>
,然后该类的对象可以将原始类的两个对象彼此进行比较:userAccountComparator.compare(acc1, acc2)
显然,在某些情况下,可比和比较器之间没有选择。如果无法修改原始类,或者需要不同的比较规则,则必须使用Comparator。否则,您可以在技术上同时使用Comparator和Comparable。
Comparable , (class's natural ordering). , (String, Date). , . , . ( BigDecimal , 4.0 4.00?). , "" . Comparable.
. , . . : . :
:
Arrays.sort(accountsList)
:
Arrays.sort(accountsList, accountByValueComparator)
, compareTo
UserAccount, - accountByValueComparator. . .
UserAccount implements Comparable<UserAccount> {
@Override
public int compareTo(UserAccount other) { .. }
}
, compareTo
? , Comparable#compareTo
, Arrays.sort()
. jdk, . : UserAccount Arrays.sort(), stream.sorted() .
在显式传递比较器的情况下,找到其使用是微不足道的。我以此为理由使用比较器。(Equals / hashCode是难以找到隐式用法的另一个示例,但没有“ Equalator”替代方法)。
总之,在大多数情况下,使用Comparator的参数胜过使用Comparable的参数。