Méthodes d'obtention de la magie php. Jeu de données d'interface. Jeu de données TreeSet

Implémentation d'interfaces Ensemble est une collection non ordonnée qui ne peut pas contenir de données en double.

Interface Ensemble comprend les méthodes suivantes :

MéthodeLa description
ajouter (Objet o) Ajout d'un élément à la collection s'il est manquant. Renvoie vrai si l'élément a été ajouté.
addAll (Collection c) Ajout d'éléments de collection s'ils sont manquants.
dégager () Nettoyer la collection.
contient (Objet o) Vérification de la présence d'un élément dans l'ensemble. Renvoie vrai si l'élément est trouvé.
contientTous (Collection c) Vérifier la présence d'une collection dans un ensemble. Renvoie true si tous les éléments sont contenus dans l'ensemble.
est égal à (Objet o) Contrôle d'égalité.
hashCode () Obtenir le hashCode d'un ensemble.
est vide () Vérification de la présence d'éléments. Renvoie true s'il n'y a aucun élément dans la collection.
itérateur () La fonction pour obtenir l'itérateur de collection.
supprimer (Objet o) Supprimer un élément d'un ensemble.
removeAll (Collection c) Supprime tous les éléments de la collection passée de l'ensemble.
RetainAll (Collection c) Suppression des éléments qui n'appartiennent pas à la collection passée.
Taille () Nombre d'articles dans la collection
toArray () Conversion d'un ensemble en un tableau d'éléments.
toArray (T a) Conversion d'un ensemble en un tableau d'éléments. Contrairement à la méthode précédente qui retourne un tableau d'objets de type Object, cette méthode retourne un tableau d'objets du type passé en paramètre.

Vers la famille d'interfaces Ensemble rapporter Jeu de hachage, Ensemble d'arbres et LinkedHashSet... En ensembles Ensemble différentes implémentations utilisent un ordre de stockage différent pour les éléments. Dans HashSet, l'ordre des éléments est optimisé pour des recherches rapides. Dans le conteneur TreeSet, les objets sont stockés triés par ordre croissant. LinkedHashSet stocke les éléments dans l'ordre dans lequel ils sont ajoutés.

Jeu de données HashSet

Constructeurs HashSet :

// Crée un ensemble vide avec une capacité initiale (16) et // un facteur de charge (0,75) par défaut public HashSet (); // Crée un ensemble à partir des éléments de la collection public HashSet (Collection c); // Crée un ensemble avec la capacité initiale spécifiée et // le facteur de charge par défaut (0,75) public HashSet (int initialCapacity); // Crée un ensemble avec la capacité initiale spécifiée et // le facteur de charge public HashSet (int initialCapacity, float loadFactor);

Méthodes HashSet

  • taille int publique ()
  • public booléen isEmpty ()
  • ajout booléen public (Objet o)
  • public booléen addAll (Collection c)
  • public boolean remove (Objet o)
  • public booléen removeAll (Collection c)
  • public boolean contient (Objet o)
  • vide public clair ()
  • clone d'objet public ()
  • iterator public iterator ()
  • public Object toArray ()
  • public booléen keepAll (Collection c)

Jeu de hachage contient des méthodes similaires à ArrayList. Une exception est la méthode add (Object o), qui n'ajoute un objet que s'il est manquant. Si l'objet est ajouté, la méthode add renvoie true, sinon false.

Un exemple d'utilisation de HashSet :

Jeu de hachage hashSet = nouveau HashSet (); hashSet.add ("Pomme de terre"); hashSet.add ("Carotte"); hashSet.add ("Beetroot"); hashSet.add ("Concombres"); // L'enregistrement suivant ne doit pas être inclus dans l'ensemble hashSet.add ("Potatoes"); // Affiche la taille de l'ensemble sur la console System.out.println ("Size hashSet =" + hashSet.size ()); // Imprimer les enregistrements de l'itérateur sur la console itr = hashSet.iterator (); while (itr.hasNext ()) (System.out.println (itr.next (). toString ());)

Nous ne devrions voir que 4 entrées dans la console. Notez que l'ordre dans lequel les enregistrements sont ajoutés à l'ensemble sera imprévisible. Jeu de hachage utilise le hachage pour accélérer l'échantillonnage.

Exemple d'utilisation Jeu de hachage avec des valeurs entières. Ajoutez des valeurs de 0 à 9 sur 25 valeurs possibles sélectionnées au hasard à l'ensemble - il n'y aura pas de duplication.

Aléatoire aléatoire = nouveau Aléatoire (30) ; Ensemble iset = nouveau HashSet (); pour (int i = 0; i< 25; i++) iset.add(random.nextInt(10)); // Вывести в консоль записи Iterator

Il est à noter que la mise en œuvre Jeu de hachage ne se synchronise pas. Si plusieurs threads accèdent à l'ensemble de hachage en même temps et qu'un ou plusieurs threads doivent modifier l'ensemble, il doit alors être synchronisé en externe. Il est préférable de le faire au moment de la création pour éviter tout accès accidentel hors synchronisation à l'ensemble :

Ensemble set = Collections.synchronizedSet (nouveau HashSet ());

Ensemble de données LinkedHashSet

Classer LinkedHashSet hérite Jeu de hachage sans ajouter de nouvelles méthodes et maintient une liste liée d'éléments de collection dans l'ordre dans lequel ils ont été insérés. Cela vous permet d'organiser une itération ordonnée de l'insertion dans l'ensemble.

Constructeurs LinkedHashSet :

// Crée un ensemble vide avec une capacité initiale (16) et un facteur de charge par défaut (0,75) public LinkedHashSet () // Crée un ensemble à partir des éléments de la collection public LinkedHashSet (Collection c) // Crée un ensemble avec un capacité initiale et une valeur de facteur charge par défaut (0,75) public LinkedHashSet (int initialCapacity) // Crée un ensemble avec une capacité initiale et un facteur de charge spécifiés public LinkedHashSet (int initialCapacity, float loadFactor)

Juste comme Jeu de hachage, LinkedHashSet ne se synchronise pas. Par conséquent, lors de l'utilisation de cette implémentation dans une application avec de nombreux threads, dont certains peuvent apporter des modifications à l'ensemble, la synchronisation doit être effectuée au stade de la création :

Ensemble set = Collections.synchronizedSet (nouveau LinkedHashSet ());

Jeu de données TreeSet

Classer Ensemble d'arbres crée une collection qui utilise une arborescence pour stocker les éléments. Les objets sont stockés par ordre croissant de tri.

Constructeurs TreeSet :

// Crée un ensemble arborescent vide, trié selon l'ordre naturel // de ses éléments TreeSet () // Crée un ensemble arborescent contenant les éléments de l'ensemble spécifié, // trié selon l'ordre naturel de ses éléments. TreeSet (Collectionc) // Création d'un arbre vide, trié selon le comparateur TreeSet (Comparatorcomparateur) // Crée un ensemble d'arbres contenant les mêmes éléments et // en utilisant le même ordre que l'ensemble trié spécifié TreeSet (SortedSet s)

Méthodes TreeSet

  • booléen ajouter (Objet o)
  • booléen addAll (Collectionc)
  • Objet plafond (Objet o)
  • vide clair ()
  • Clone TreeSet ()
  • Comparateurcomparateur ()
  • booléen contient (Objet o)
  • Itérateur itérateur descendant ()
  • NavigableSet descendantSet ()
  • Objet d'abord ()
  • Objet sol (Objet o)
  • Ensemble trié casque (E e)
  • NavigableSet headSet (E e, booléen inclus)
  • Objet supérieur (Objet o)
  • booléen estVide ()
  • Itérateur itérateur ()
  • E dernier ()
  • E inférieur (E e)
  • E pollFirst ()
  • E sondageDernier ()
  • booléen supprimer (Objet o)
  • taille int ()
  • Séparateur séparateur ()
  • NavigableSet sous-ensemble (E fromElement, boolean fromInclusive, E toElement, boolean toInclusive)
  • Ensemble trié sous-ensemble (E fromElement, E toElement)
  • Ensemble trié tailSet (E fromElement)
  • NavigableSet tailSet (E fromElement, booléen inclus)
  • Dans l'exemple modifié suivant utilisant Ensemble d'arbres la console affichera les valeurs de manière ordonnée.

    Ensemble trié treeSet = nouveau TreeSet (); treeSet.add ("Beet"); treeSet.add ("Concombres"); treeSet.add ("Tomates"); treeSet.add ("Pommes de terre"); treeSet.add ("Carotte"); // Cette entrée ne doit pas être incluse dans le treeSet.add ("Potatoes"); // Affiche sur la console la taille de l'ensemble System.out.println ("Taille de treeSet =" + treeSet.size ()); // Imprimer les enregistrements de l'itérateur sur la console itr = treeSet.iterator (); while (itr.hasNext ()) (System.out.println (itr.next (). toString ());) Aléatoire aléatoire = nouveau Aléatoire (30) ; Ensemble trié iset = new TreeSet (); pour (int i = 0; i< 25; i++) iset.add(random.nextInt(10)); // Вывести в консоль записи Iteratoritr = iset.iterator (); while (itr.hasNext ()) (System.out.println (itr.next (). toString ());)

    Joseph Crawford, l'un de mes lecteurs, a lu un article sur la façon dont je déteste écrire des getters et des setters et m'a suggéré d'utiliser les méthodes magiques __get et __set.
    Je vais vous dire pourquoi ce n'est pas une bonne idée de les utiliser de la manière habituelle. Aussi, je vais vous raconter une histoire où ils se sont vraiment avérés utiles - il s'agit de créer des types statiques en PHP (un langage dynamique).
    Pour ceux qui ne connaissent pas les méthodes __get et __set, ce sont deux méthodes "magiques" qui fonctionnent comme suit :
    class Animal (fonction __get ($ propriété) (// ...) fonction __set (propriété $, valeur $) (// ...)) $ cow = new Animal; $ vache -> poids = "1 tonne" ; // identique à $ vache -> __ set ("poids", "1 tonne") print $ vache-> poids ; // identique à print $ cow -> __ get ("poids");

    En règle générale, les méthodes ci-dessus sont utilisées pour créer des propriétés dynamiques. Quelle conclusion peut-on en tirer ? Si vous souhaitez créer des propriétés aléatoires, utilisez simplement un hachage (c'est-à-dire un tableau avec des clés).
    Qu'est-ce qui est bien avec les getters et les setters ?
    Jetons un coup d'œil :
    classe Animal (public $ weightInKgs;) $ vache = nouvel animal ; $ vache-> poidsEnKgs = -100 ;

    Quoi? Poids négatif ? C'est faux de la plupart des points de vue.
    Une vache ne doit pas peser moins de 100 kg (je pense que oui :). Dans 1000 est acceptable.
    Comment assurer une telle limitation.
    Utiliser __get et __set est un moyen assez rapide.
    class Animal (private $ properties = array (); public function __get ($ name) (if (! empty ($ this-> properties [$ name])) (return $ this-> properties [$ name];) else ( throw new Exception ("Propriété non définie". $ name. "referenced.");)) public function __set ($ name, $ value) (if ($ name == "weight") (if ($ value< 100) { throw new Exception("The weight is too small!") } } $this->propriétés [$ nom] = $ valeur ; )) $ vache = nouvel animal ; $ vache-> poidsEnKgs = -100 ; // lève une exception

    Que se passe-t-il si vous avez une classe avec 10 à 20 propriétés et que vous les vérifiez ? Dans ce cas, les ennuis sont inévitables.
    fonction publique __set ($ name, $ value) (if ($ name == "weight") (if ($ value< 100) { throw new Exception("The weight is too small!") } if($this->poids! = $ poids) (Berger :: notifyOfWeightChange ($ vache, $ poids);)) if ($ name == "legs") (if ($ value! = 4) (lancer une nouvelle exception ("Le nombre de jambes est trop petit ou trop grand ")) $ this-> numberOfLegs = $ numberOfLegs; $ this-> numberOfHooves = $ numberOfLegs;) if ($ name ==" milkType ") (.... vous voyez l'idée ... .) $ this-> propriétés [$ nom] = $ valeur ; )

    À l'inverse, les getters et les setters font de leur mieux pour valider les données.
    class Animal (private $ poids; private $ numberOfLegs; private $ numberOfHooves; public $ pseudo; public function setNumberOfLegs ($ numberOfLegs) (if ($ numberOfLegs! = 100) (lancer une nouvelle exception (" Le nombre de pattes est trop petit ou trop gros ");) $ this-> numberOfLegs = $ numberOfLegs; $ this-> numberOfHooves = $ numberOfLegs;) fonction publique getNumberOfLegs () (return $ this-> numberOfLegs;) fonction publique setWeight ($ poids) (if ($ poids< 100) { throw new Exception("The weight is too small!"); } if($this->poids! = $ poids) (Berger :: notifyOfWeightChange ($ vache, $ poids);) $ this-> poids = $ poids; ) fonction publique getWeight () (retourner $ this-> weight ;))

    Rien ne vaut les raccourcis (get, set;) de C #. Il est probable qu'un tel support apparaisse bientôt en PHP, mais pour l'instant, ne nous relâchons pas...
    Chaque méthode n'est responsable que de sa propre zone, ce qui facilite la navigation dans le code. C'est encore trop de code, mais c'est plus propre que la version __set. Il existe une bonne approche heuristique, qui est la suivante : si votre méthode (fonction) occupe plus d'un écran, vous devez la raccourcir. Cela améliorera la lisibilité du code.
    Nous stockons également une certaine logique métier. Il y aura toujours exactement autant de sabots que de pattes, et si nous remarquons un changement dans le poids du bétail, nous en informerons immédiatement le berger.
    Étant donné que nous ne nous soucions pas des surnoms de vache et que nous ne les vérifions pas, laissez les données être publiques sans getters ni setters.
    Encore une fois, je n'ai pas vraiment écrit tous ces getters et setters - PHP Storm l'a fait pour moi. Je viens d'écrire ce qui suit :
    classe Animal (privé $ poids; privé $ numberOfLegs ;)

    Et appuyez sur Alt + Insert -> Getters et setters. PHPStorm a tout généré automatiquement.
    Maintenant, comme avantage supplémentaire de PHP Storm lorsque je travaille avec des getters et des setters, je peux utiliser la fonction de saisie semi-automatique :

    Dans le cas de __get, je n'ai pas cette opportunité, je ne peux qu'écrire ceci :
    $ vache-> poids = -100

    La vache « pèse » maintenant (poids) moins 100 kg.
    Je peux oublier qu'il s'agit du poids en kg, il suffit d'écrire le poids - tout fonctionnera.
    Les getters et setters peuvent donc être très utiles (mais ne les adorez pas, vous n'êtes pas un programmeur Java). Si vous voulez juste des propriétés lâches, utilisez un tableau :
    $ vache = tableau ("poids" => 100, "jambes" => 4);

    Cette astuce est beaucoup plus facile à réaliser que __get et __set.
    Mais, si vous voulez être sûr que vos données n'ont toujours que des valeurs valides, utilisez des setters validés. Si vous avez un environnement de développement intégré (IDE) comme PHP Storm, vous allez adorer les setters car ils sont si faciles à utiliser. Au lieu de $ cow-> setLegs() pour PHP Storm, il suffira de taper cosl. Oui Facile ! Plus de fautes de frappe et vous pouvez voir quels paramètres la méthode prend.
    La méthode __set a un autre inconvénient. Il ne prend qu'un paramètre. Et si vous en avez besoin de 2 ? Par exemple, comme ceci : $ store1-> setPrice ("item-1", 100). Vous devez définir le prix de l'article dans le magasin. La méthode __set ne vous permettra pas de faire cela, mais le setter le fera.

    Pour contrôler l'utilisation des champs, vous pouvez créer des méthodes get et set et les rendre publiques. Ils offrent la possibilité de contrôler l'accès à un champ. Dans le même temps, il est préférable de rendre le champ Age privé, afin qu'il ne soit pas directement accessible en dehors de la classe.

    compte de classe publique

    âge int privé;

    public int GetAge ()

    retourner this.age;

    public void SetAge (int inAge)

    si ((inAge> 0) && (inAge< 120))

    this.age = inAge;

    Vous pouvez désormais contrôler l'accès à notre champ, mais pour cela, vous devez écrire beaucoup de code supplémentaire. Pour accéder à la valeur de l'âge, vous devez appeler les méthodes générées :

    Compte s = nouveau compte ();

    Console.WriteLine ("Age :" + s.GetAge ());

      1. Utilisation des propriétés

    Les propriétés facilitent la gestion de vos données. La propriété Age peut être déclarée comme ceci :

    compte de classe publique

    int privé ageValue;

    si ((valeur> 0) && (valeur< 120))

    ageValue = valeur ;

    return ageValue;

    Ici, la valeur d'âge est une propriété. La propriété déclare des sections pour l'écriture et la lecture de sa valeur. Les étapes décrites dans ces sections sont équivalentes aux méthodes décrites précédemment. Dans ce cas, les propriétés sont utilisées de la même manière que les champs ordinaires :

    Compte s = nouveau compte ();

    Console.WriteLine ("Age :" + s.Age);

    Lorsque la propriété Age reçoit une valeur, le code de section défini est appelé. Le mot-clé value désigne une valeur affectée à une propriété. Lorsque la valeur de la propriété Age est lue, le code de la section get est appelé. Cette approche combine les avantages de l'utilisation de méthodes et rend l'utilisation des propriétés aussi simple que l'utilisation des champs de classe.

    Validation des données dans les propriétés ... Si vous essayez de définir une valeur d'âge invalide (par exemple, 150), le code ci-dessus effectuera un contrôle de validation et rejettera cette valeur (personne de plus de 120 ans ne peut avoir de compte auprès de notre banque), en laissant l'ancienne valeur. Le seul moyen de savoir si une propriété a reçu une valeur est de vérifier la valeur de la propriété après cette opération :

    Compte s = nouveau compte ();

    int nouvelAge = 150 ;

    si (s.Age! = newAge)

    Console.WriteLine ("La valeur d'âge n'a pas été définie");

    Le code ci-dessus essaie de définir l'âge sur une valeur non valide de 150, puis vérifie si cette valeur a été définie. Si la méthode Set était utilisée pour attribuer une valeur, elle pourrait renvoyer une valeur faux en cas d'échec, et lors de l'utilisation de la propriété, l'utilisateur doit faire un peu plus de travail supplémentaire.

    Différentes façons de lire la valeur de la propriété. Les propriétés vous permettent également d'effectuer d'autres actions utiles.

    public int AgeInMonths

    renvoie this.ageValue * 12;

    La nouvelle propriété AgeInMonths est décrite ici. Il est en lecture seule car il ne contient pas de section définie. Elle renvoie la valeur d'âge en mois en utilisant la même valeur que la propriété Age. Cela signifie que vous pouvez utiliser plusieurs méthodes différentes pour obtenir la même valeur. Vous pouvez créer des propriétés en lecture seule sans les modifier directement, ainsi que des propriétés en écriture seule, bien que ces dernières soient rarement utilisées.

    Propriétés des éléments visuels ... Il est logique d'utiliser des propriétés dans la description d'un compte bancaire, où vous devez protéger les données dans les objets. Mais dans Silverlight, vous pouvez saisir n'importe quel texte dans un TextBlock, et il ne semble pas nécessaire de valider la valeur que vous avez saisie. L'exécution de ce code ralentira le processus de saisie d'une valeur. Ainsi, en faisant de la valeur Text une chaîne publique, le programme contiendrait moins de code et s'exécuterait plus rapidement.

    Cependant, lorsque nous modifions le texte dans le TextBlock, nous souhaitons que le texte de la page Silverlight change également, par exemple lorsque le programme Accumulator imprime le résultat. Si le programme modifiait simplement la valeur du champ, Silverlight n'aurait aucun moyen de savoir que le message à l'écran doit être mis à jour.

    Cependant, si Text est défini en tant que propriété, lorsque la valeur du TextBlock est mise à jour, la méthode appropriée s'exécute, qui peut mettre à jour la valeur stockée de la zone de texte et appeler la méthode pour mettre à jour l'écran pour afficher la nouvelle valeur. Les propriétés offrent la possibilité de contrôler un objet lorsque sa valeur change. Opération simple :

    resultTextBlock.Text = "0";

    peut entraîner plusieurs centaines d'opérations C # car le stockage d'une nouvelle valeur dans le TextBlock déclenche des opérations pour mettre à jour l'écran.

    2022 wisemotors.ru. Comment ça fonctionne. Fer. Exploitation minière. Crypto-monnaie.