Ecrire une classe qui peut être ordonnée en Java Un petit mémo standard

introduction

Dans le chapitre 3-3 Recherche de deux minutes du livre "Algorithmes et structures de données Java nouveaux et clairs", il y avait une norme à retenir lors de l'écriture de Java, je vais donc la résumer dans cet article en incluant la recherche de deux minutes. C'était.

Dichotomie avec Java

Java fournit une bibliothèque standard de méthodes pour dichotomiser un tableau. Une méthode binarySearch qui appartient à la classe java.util.Arrays.

Référence: https://docs.oracle.com/javase/jp/8/docs/api/java/util/Arrays.html

Comme vous pouvez le voir dans le lien de référence ci-dessus, de nombreuses méthodes binarySearch sont définies pour prendre en charge divers types d'éléments. Les deux dichotomisent les éléments de valeur clé du tableau trié ascendant (les résultats ne sont pas définis s'ils ne sont pas ascendants). S'il existe une clé de recherche dans le tableau, l'index de la clé de recherche est renvoyé, et si elle n'existe pas, (- (point d'insertion) -1) est renvoyé.

Cette fois, nous nous concentrerons sur les deux points suivants.

static int binarySearch(Object[] a, Object key)
static <T> int binarySearch(T[] a, T key, Comparator<? super T> c)

static int binarySearch(Object[] a, Object key) Jugez la relation de grandeur des éléments dans un ordre naturel. Veuillez vous référer à ce qui suit pour une commande naturelle.

Référence: https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Comparable.html

Si vous avez un tableau de types qui implémente l'interface Comparable dans le lien de référence ci-dessus, vous pouvez facilement écrire du code pour faire une dichotomie en utilisant cette méthode.

Un petit standard de définition de classe qui peut être naturellement ordonné

En d'autres termes, même pour votre propre classe, vous pouvez définir un ordre naturel en implémentant cette interface Comparable, et vous pouvez utiliser cette méthode. C'est une bonne idée de se souvenir de ce qui suit comme un petit standard.

Classe naturellement ordonnée.java


public class Hoge implements Comparable<Hoge> {
    //Champs, méthodes, etc.

    @Override
    public int compareTo(A c) {
        //Si c'est supérieur à c, une valeur positive,
        //Si c'est inférieur à c, une valeur négative,
        //Renvoie 0 si c'est égal à c.
    }

    @Override
    public boolean equals(Object c) {
        //Vrai si c'est égal à c,
        //Renvoie false si ce n'est pas égal à c.
    }
}

À ce stade, la cohérence peut être obtenue comme "lorsque la méthode conpareTo retourne 0, la méthode ʻequals retourne true, et lorsque la méthode compareTo retourne une valeur non nulle, la méthode ʻequals retourne false ". Ce serait bien de le faire.

static int binarySearch(T[] a, T key, Comparator<? super T> c) Cette méthode peut être utilisée pour une dichotomie à partir d'un tableau qui n'est ** pas ** ordonné dans son ordre naturel. Puisqu'il s'agit d'une méthode générique, tout élément du tableau est OK.

Cependant, vous devez indiquer à la méthode comment déterminer la relation de grandeur de chaque élément. Pour ce faire, passez une instance de la classe qui implémente l'interface java.util.Comparator comme troisième argument.

Un petit standard qui définit un comparateur

Par exemple, un comparateur de classe Fuga peut être défini comme: C'est une bonne idée de se souvenir de cela comme un petit standard.

Définir un comparateur à l'intérieur de la classe.java


public class Fuga {
    //Champs, méthodes, etc.

    public static final Comparator<Fuga> COMPARATOR = new Comp();

    private static class Comp implements Comparator<Fuga> {
        public int compare(Fuga d1, Fuga d2) {
            //Si d1 est supérieur à d2, alors une valeur positive,
            //Valeur négative si d1 est inférieur à d2,
            //Renvoie 0 si d1 est égal à d2.
        }
    }
}

En passant «Fuga.COMPARATOR» comme troisième argument de la méthode «binarySearch», la relation de grandeur peut être déterminée en fonction du comparateur défini, et une dichotomie du tableau de type «Fuga» peut être effectuée.

Recommended Posts

Ecrire une classe qui peut être ordonnée en Java Un petit mémo standard
Ecrire une classe en Kotlin et l'appeler en Java
Créez un fichier jar qui peut être exécuté sur Gradle
Java (édition super débutante) compréhensible en 180 secondes
[MQTT / Java] Implémentation d'une classe qui fait Pub / Sub de MQTT en Java
Qu'est-ce qu'une classe en langage Java (3 /?)
Résumé de l'ORM "uroboroSQL" qui peut être utilisé dans le Java d'entreprise
Qu'est-ce qu'une classe en langage Java (1 /?)
Qu'est-ce qu'une classe en langage Java (2 /?)
Création d'une classe de matrice dans Java Partie 1
Comment créer une paire de clés d'ecdsa dans un format lisible par Java
J'ai créé une classe qui peut utiliser JUMAN et KNP de Java
[Android Studio] Description qui peut être saisie en continu dans la base de données SQLite [Java]
[Java] Implémenter une fonction qui utilise une classe implémentée dans le modèle Builder
GetInstance () à partir d'une classe @Singleton dans Groovy à partir de Java
Un fichier bat qui utilise Java dans Windows
Un examen rapide de Java appris en classe
Classe StringConverter à usage général qui utilise des génériques dans Java8
[Java 8] Jusqu'à la conversion de l'entrée standard qui peut être utilisée dans les tests de codage en une liste ou un tableau
Déconnectez un fichier CSV qui peut être lu par Excel à l'aide de la fonction logback
Extrait technologique pouvant être utilisé pour créer des sites EC dans la formation Java
Interface fonctionnelle de base compréhensible en 3 minutes
Un examen rapide de Java appris en classe part4
Un examen rapide de Java appris en classe part3
Un examen rapide de Java appris en classe part2
Touches de raccourci pratiques pour Eclipse
Une bibliothèque qui réalise des chaînes multilignes en chaîne multiligne Java
Écrire l'héritage de classe dans Ruby
Ecrire des rappels de vol en Java
Rechercher un sous-ensemble en Java
Écrire du code de type Java8 en Java8
Liste des appareils pouvant être prévisualisés avec Swift UI
Problèmes facilement confondus avec Java et JavaScript
Introduction à Rakefile qui peut être effectuée en 10 minutes environ
Rechercher une instruction Switch qui peut être convertie en une expression Switch
Nouvelles fonctionnalités de Java 14 pouvant être utilisées pour écrire du code
Syntaxe et conditions d'occurrence d'exception pouvant être utilisées lors de la comparaison avec null en Java
[Java 8] Méthode de tri par ordre alphabétique et par ordre de longueur de chaîne de caractères pouvant être utilisée dans les tests de codage
Outil d'analyse statique pouvant être utilisé avec GitHub [version Java]
3 Implémentez un interpréteur simple en Java
Je ne peux pas créer une classe Java avec un nom spécifique dans IntelliJ
Comment implémenter un travail qui utilise l'API Java dans JobScheduler
Gérer la logique métier pour un ensemble d'entités dans une classe Java
Notez que les propriétés système, y compris JAXBContext, ne peuvent pas être utilisées dans Java11
J'ai écrit une sorte de livre qui ressemble à Java
Classe StringBuffer et StringBuilder en Java
J'ai posé une question qui peut être utilisée pour des entretiens techniques
Un exemple simple de rappels en Java
SwiftUI View qui peut être utilisé en combinaison avec d'autres frameworks
Création d'une classe pour une matrice en Java Partie 2-A propos d'une matrice (algèbre linéaire) -
Il semble que Java 14 ajoutera des fonctions de type classe de données
Voyons la Deep Java Library (DJL), une bibliothèque capable de gérer Deep Learning en Java, publiée par AWS.
Installation de Mecab qui peut se faire presque en tapant une commande
Restez coincé dans un Java Primer
Comment écrivez-vous dans Scala qui a été écrit en Java? (Liste → Carte)
Comment tester une méthode privée et la simuler partiellement en Java
[Java] Introduction de l'utilitaire "ZT Zip" qui peut gérer très facilement les fichiers ZIP