Choisir entre comparateur et comparable

Pour mettre en œuvre le tri, il est nécessaire que les objets en cours de tri puissent être comparés les uns aux autres pour plus ou moins. En d'autres termes, définir une règle qui permettra à deux objets quelconques d'indiquer lequel d'entre eux dans le contexte donné arrive le plus tôt et lequel plus tard.

En java, ces règles sont définies au niveau des classes auxquelles appartiennent les objets. Par exemple, prenons une classe pour décrire le compte d'un utilisateur:

UserAccount {
  currency
  value
  updatedTimestamp
}

Selon le contexte, les comptes utilisateurs peuvent être comparés selon différentes règles, par exemple:

  • dans l'application, l'utilisateur voit les comptes triés par devise, puis par valeur;

  • dans le panneau d'administration, tous les comptes utilisateurs sont triés par date de modification.

Pour implémenter la comparaison pour plus ou moins en java, il y a deux possibilités:

  • UserAccount implémente l'interface Comparable<UserAccount>Dans ce cas, deux objets ont la possibilité de se comparer:acc1.compareTo(acc2)

  • Une classe distincte est créée qui implémente l'interface Comparator<UserAccount>, puis l'objet de cette classe peut comparer deux objets de la classe d'origine entre eux:userAccountComparator.compare(acc1, acc2)

De toute évidence, dans certains cas, il n'y a pas de choix entre Comparable et Comparator. Si la classe d'origine ne peut pas être modifiée ou si des règles de comparaison différentes sont requises, un comparateur doit être utilisé. Sinon, vous pouvez techniquement utiliser à la fois Comparator et 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() .

Dans le cas d'un transfert explicite d'un comparateur, trouver son utilisation est élémentaire. Je prends cela comme un argument pour utiliser un comparateur. (Equals / hashCode est un autre exemple de difficulté à trouver des usages implicites, mais il n'y a pas d'alternative "Equalator" pour eux).

En résumé, dans la plupart des cas, les arguments pour l'utilisation de Comparator l'emportent sur les arguments pour l'utilisation de Comparable.




All Articles