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

Langage Java Discussion :

comparaison de Hashtables


Sujet :

Langage Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 6
    Points : 2
    Points
    2
    Par défaut comparaison de Hashtables
    Bonjour^^
    Je cherche à comparer les valeurs et les clés d'une Hashtable, elle-même contenue dans une Hashtable en tant que valeur (Hashtable<String, Hashtable>), avec d'autres Hashtables; Je ne sais pas du tout comment m'y prendre >< Need help =)

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    tu pourrais préciser quels sont tes critères de comparaison et pourquoi la méthode equals ne te convient pas?

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    En gros, je dois créer une méthode makeable (Hashtable ingrédients, Hashtable recette) qui doit retourner la liste des recettes possibles avec les ingrédients disponibles.

    On a ingrédients<nom, quantité> et recette<nom, <ingédients qu'il faut> > mais je ne sais pas comment manipuler tout ça...

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Le mieux serait ceci comme structure

    List<Ingredient> (listes des ingrédients)

    et Map<Recette,List<Ingredient>> (liste des recetes avec pour chaque une liste d'ingrédients)

    ensuite tu parcoure tes recettes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    List<Recette> makeable(Map<Recette,List<Ingredient>>  recettes,  List<Ingredient> disponibles){
      List<Recette> result = new ArrayList<Recette>();
      for (Map.Entry<Recette,List<Ingredient>> element : recettes.entrySet()){
        if (disponible.containsAll(element.getValue())
            result.add(element.getKey());
      }
      return result;
    }
    autre option
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    List<Recette> makeable(List<Recette> recettes,  List<Ingredient> disponibles){
      List<Recette> result = new ArrayList<Recette>();
      for (Recette recette: recettes){
        if (disponible.containsAll(recette.getIngredients())
            result.add(recette);
      }
      return result;
    }

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci pour ta réponse, mais je ne vois pas comment une liste pourrait stocker l'ingrédient PLUS la quantité disponible...
    Ma Hashtable inventaire est comme ceci :
    sucre 5
    sel 2
    oeufs 3

    et et recette comme ça :
    gateau : sucre 2 oeuf 1
    omelette : sel 1 oeufs 2

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    dans ce cas, tu fais deux boucles imbriquée et tu fais tout à la main.

  7. #7
    Membre averti
    Homme Profil pro
    Consultant PLM
    Inscrit en
    Août 2007
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Consultant PLM

    Informations forums :
    Inscription : Août 2007
    Messages : 203
    Points : 304
    Points
    304
    Par défaut
    Tu fais un objet "Nourriture", qui a 2 attributs :
    * 1 String : l'ingrédient lui-même
    * 1 Integer : la quantité

    Après, tu fais un objet "Inventaire", qui a 2 attributs :
    * 1 String : le nom du proprio du frigo [on ne fait jamais un programme que pour soi-même, il faut prévoir l'évolution]
    * 1 List<Nourriture>

    Et tu fais un objet "Recette", qui a 2 attributs :
    * 1 String : le nom de la recette
    * 1 List<Nourriture> : l'ensemble des ingrédients de la recette


    Par contre, ce que je constate, c'est qu'il faudrait voir pour définir correctement ta comparaison, car faire un equals est légèrement bête : si on imagine que tu as 3 oeufs dans ton frigo, et que ta recette en demande 2, je pense qu'il faudrait répondre OK sur le fait qu'on peut faire la recette. Je verrais plutôt un "contains" plutôt qu'un "equals".

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    Merci mais le problème est que je dois scrupuleusement respecter les entreées et la sortie de la méthode makeable, qui prend en paramètres deux Hashtables et qui renvoie une Arraylist.

    Je suis désolé mais je ne comprends pas l'histoire de la double boucle imbriquée =S Pourrais-tu être plus concret?

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    ben tu parcoure ta liste de recette (1ère boucle) et pour chaque recette tu parcoure la liste des ingrédients nécessaires (deuxième boucle), et pour chacun tu regarde si il y en a assez de dispo. Si pas tu passe à la recette suivante.

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 6
    Points : 2
    Points
    2
    Par défaut
    J'ai essayé mais il me renvoie pleins d'erreurs de compilation...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
     
    Enumeration e = ingredients.elements();
    Enumeration k = ingredients.keys();
    Enumeration e1 = recettes.elements();
    Enumeration k1 = recettes.keys();
     
     
     
     
     
    while(e1.hasMoreElements()) {
    			 Enumeration z = ((Hashtable) e1.nextElement()).keys();
    			 Enumeration z1 = ((Hashtable) e1.nextElement()).elements();
    			 while(z.hasMoreElements()) {
    				 while(k.hasMoreElements()) {
     
    					 if (z.nextElement().equals(k.nextElement())) {
    						 if (Integer.parseInt(e1.nextElement().toString()) >= Integer.parseInt( z1.nextElement().toString())) {
    							 System.out.println(e1.nextElement().toString());
     
    						 }
    					 }
     
    				 }
     
     
     
    				 //System.out.println(z.nextElement().toString());
    			 } 
     
    		}

  11. #11
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 253
    Points : 446
    Points
    446
    Par défaut
    Si la signature de makable ne t'est pas imposéé, tu peux utiliser cette implémentation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public List<Recette> makable(Map<String, Integer> ingrediantsDisponibles,
    			List<Recette> recettes) {
    		List<Recette> recettesRealisables = new LinkedList<Recette>();
     
    		for (Recette recette : recettes) {
    			if (recette.canBeDoneWith(ingrediantsDisponibles)) {
    				recettesRealisables.add(recette);
    			}
    		}
     
    		return recettesRealisables;
    	}
    Avec la classe recette:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.Map.Entry;
     
    public class Recette {
    	private String nom;
    	private Map<String, Integer> ingrediants = new HashMap<String, Integer>();
     
    	public Recette(String nom, Map<String, Integer> ingrediants) {
    		super();
    		this.nom = nom;
    		this.ingrediants = ingrediants;
    	}
     
    	public void addIngrediant(String ingrediant, int quantite) {
    		ingrediants.put(ingrediant, quantite);
    	}
     
    	/**
             * @return the nom
             */
    	public String getNom() {
    		return nom;
    	}
     
    	/**
             * @param nom
             *            the nom to set
             */
    	public void setNom(String nom) {
    		this.nom = nom;
    	}
     
    	/**
             * @return the ingrediants
             */
    	public Map<String, Integer> getIngrediants() {
    		return ingrediants;
    	}
     
    	/**
             * @param ingrediants
             *            the ingrediants to set
             */
    	public void setIngrediants(Map<String, Integer> ingrediants) {
    		this.ingrediants = ingrediants;
    	}
     
    	public boolean canBeDoneWith(Map<String, Integer> ingrediantsDisponibles) {
    		boolean canBeDone = true;
    		Iterator<Entry<String, Integer>> iterator = ingrediants.entrySet()
    				.iterator();
    // Tant que la recette reste realisable
    // On itère sur les ingrediants necessaires
    		while (iterator.hasNext() && canBeDone) {
    			Entry<String, Integer> ingrediantNecessaire = iterator.next();
     
    // La recette est realisable si ...
    			canBeDone = 
    // ... on dispose des ingrediants necessaires
    ingrediantsDisponibles.containsKey(ingrediantNecessaire.getKey()) &&
    // ... en quantité suffisante
    ingrediantsDisponibles.get(ingrediantNecessaire.getKey())>=ingrediantNecessaire.getValue(); 
    		}
     
    		return canBeDone;
    	}
     
    }
    Le tout avec un semblant de test rapide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    /**
             * @param args
             */
    	public static void main(String[] args) {
    		Map<String, Integer> ingrediantsDansLeFrigo = new HashMap<String, Integer>() {
    			{
    				put("Persil", 4); 
    				put("Oeuf", 5);
    				put("Farine", 200); // 200g
    				put("Lait", 400); // 4 briques de 1L
    //				put("Beurre", 500);
    			}
    		};
     
    		Recette crepes = new Recette("Crepes", new HashMap<String, Integer>() {
    			{
    				put("Oeuf", 2);
    				put("Farine", 200);
    				put("Lait", 100);
    			}
    		});
    		Recette bechamel = new Recette("Sauce béchamel",
    				new HashMap<String, Integer>() {
    					{
    						put("Beurre", 100);
    						put("Farine", 100);
    						put("Lait", 100);
    					}
    				});
     
    		List<Recette> recettes = new ArrayList<Recette>(2);
    		recettes.add(crepes);
    		recettes.add(bechamel);
     
    		List<Recette> makable = makable(ingrediantsDansLeFrigo,
    				recettes);
    		for (Recette recette : makable) {
    			System.out.println(recette.getNom());
    		}
     
    	}
    Il est agréable d'avoir le choix. La difficulté est alors de faire le bon (ou le moins pire).

Discussions similaires

  1. comparaison de 2 dates
    Par eisti dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 11/08/2003, 11h33
  2. Comparaison de fichier
    Par danzerg dans le forum Langage
    Réponses: 2
    Dernier message: 21/02/2003, 11h49
  3. Comparaison JBuilder avec Sun ONE Studio
    Par chichos dans le forum EDI et Outils pour Java
    Réponses: 4
    Dernier message: 13/11/2002, 15h08
  4. Comparaison d'un registre 8 bits avec une variable 32 bits
    Par tupperware dans le forum x86 32-bits / 64-bits
    Réponses: 3
    Dernier message: 15/10/2002, 10h25

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