IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

Remplir une map selon une logique donnée


Sujet :

Collection et Stream Java

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2014
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2014
    Messages : 54
    Points : 47
    Points
    47
    Par défaut Remplir une map selon une logique donnée
    Bonjour les amis,

    Je suis un peu débutant avec Java et j auris besoin de votre aide!!

    J'ai un object

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class Object{
     
    int first;
    int second;
     
    public Object(int first, int second){
    this.first = first;
    this.second = second;
    }
     
    }
    J'aimerais peupler une
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Map<Object, int> map = new HashMap<Object, int>();
    selon la logique suivante:

    J ai 3 objects:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Object obj1 = new Object(5,10);
    Object obj2 = new Object(5,3);
    Object obj3 = new Object(8,2);
    Object obj4 = new Object(8,4);
    Object obj5 = new Object(5,20);
    Si deux objects ont la meme valeur du champ first (obj1.first = obj2.first), je mettrai dans la map l objet qui a la valeur la plus grande du champ second.

    Concretment, j aimerais que map contienne obj4 et obj5 en cle et en valeur le champ first:
    (obj4,8) et (obj5,5)

    Je me demadias si Java offre un mecanisme intelligent et efficace pour faire cela, comme par exemple Comparator qui permet de remplir une TreeMap directement selon une logique donnee (implementee dans Comparator)?
    Y-a-t-il quelaue chose de similaire que je pourrais utiliser dans ce cas la?

    Merci de votre aide!!

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Pour identifier que l'objet est déjà présent, tout est prévu. Par contre tu devra faire la partie "si c'est présent, je compare la valeur avec celle déjà stockée". Il suffit que ton Object implémente hashCode() et equals() en se basant uniquement sur first. Vu que c'est un int c'est assez facile, hashcode demandant de retourner un int


    Au final on aura donc que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new Object(5,10).equals(new Object(5,3))
    Ensuite tu fais méthode d'ajout sur base du principe "si existe comme clé, récuper la valeur, comparer, ajouter si nouveau ou supérieur"

    Les méthodes dont tu aura besoin sont là containsKey, get et put

  3. #3
    Membre chevronné
    Avatar de eulbobo
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2003
    Messages : 786
    Points : 1 993
    Points
    1 993
    Par défaut
    Tu essayes de faire quoi précisement?
    Parce que la réponse de tchize_ te permettra effectivement de trouver une solution à ton problème, mais vu les objets que tu manipules, je pense qu'on a moyen de faire plus simple.

    Et faut éviter de nommer une classe Object (parce que Object c'est la base)

    Bon, ce que tu veux, c'est pouvoir stocker des couples de valeurs et pouvoir les retrouver ensuite?
    La solution hashCode/equals basés sur le premier chiffre pourra marcher, mais partiellement :
    new Object(1, 2) et new Object(1, 12) seront considérés comme identiques si tu fais ça, donc tu ne pourras pas les utiliser en tant que clé pour retrouver ta valeur dans la map (sauf si la deuxième valeur n'a pas de sens)
    Et si la deuxième valeur n'a pas de sens, elle n'a pas lieu d'être.

    Si tu veux stocker juste un couple de valeur, avec une clé unique, pourquoi ne pas utiliser une simple Map<Integer, Integer>, et pour chaque nouvelle valeur, vérifier s'il existe une clé, et si oui, vérifier que la valeur est plus petite que celle que tu veux enregistrer?

Discussions similaires

  1. Réponses: 6
    Dernier message: 21/06/2012, 16h13
  2. [XL-2003] Recopier une ligne selon une valeur d'une cellule donnée.
    Par bokgkik dans le forum Excel
    Réponses: 2
    Dernier message: 07/12/2011, 19h00
  3. Réponses: 1
    Dernier message: 21/01/2011, 10h17
  4. Réponses: 8
    Dernier message: 27/08/2008, 18h36
  5. Réponses: 12
    Dernier message: 12/09/2007, 16h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo