Menu

Problème de gestion des matrices en java [Résolu]

Messages postés
10
Date d'inscription
vendredi 11 mai 2018
Dernière intervention
21 décembre 2018
- - Dernière réponse : KX
Messages postés
15913
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 janvier 2019
- 13 mai 2018 à 16:29
Bonjour,

je trouve une difficulté pour créer un algorithme java qui permet de faire la suite :



il faut connaitre que la matrice est de taille n*2 de chaine de caractaire et la nombre de redandance des chaines de caractaire dans la matrice d'entre est max 2
quelqu'un m'aidé ! et merci
Afficher la suite 

Votre réponse

1 réponse

Meilleure réponse
Messages postés
15913
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 janvier 2019
3625
2
Merci
Bonjour,

Voici une idée :

Tu gères un "dictionnaire de synonymes" basé sur une Map<String, Set<String>> où tu pourras ajouter des couples de "mots égaux" qui s'accumuleront par transitivité.
Ce sera plus simple à gérer de le faire au fur et à mesure (ligne par ligne dans ton tableau) que globalement en une seule fois sur l'intégralité du tableau.

Exemple :
new → {}
add(Help, ABC) → {Help=[Help, ABC], ABC=[Help, ABC]}
add(Hello, Bonsoir) → {Help=[Help, ABC], ABC=[Help, ABC], Hello=[Bonsoir, Hello], Bonsoir=[Bonsoir, Hello]}
add(Help, Jour) → {Help=[Help, ABC, Jour], ABC=[Help, ABC, Jour], Jour=[Help, ABC, Jour], Hello=[Bonsoir, Hello], Bonsoir=[Bonsoir, Hello]}

Ton résultat sera alors les différents Set<String> présents dans la Map, dans l'exemple ce serait donc
[Help, ABC, Jour]
et
[Bonsoir, Hello]
comme dans ton illustration.

Dire « Merci » 2

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CommentCaMarche

CCM 56032 internautes nous ont dit merci ce mois-ci

nidhalos
Messages postés
10
Date d'inscription
vendredi 11 mai 2018
Dernière intervention
21 décembre 2018
-
merci bien mais il'ya une méthode plus simple ; car je suis pas sure que je suis capable a développer cette idée en java
KX
Messages postés
15913
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 janvier 2019
3625 > nidhalos
Messages postés
10
Date d'inscription
vendredi 11 mai 2018
Dernière intervention
21 décembre 2018
-
En fait la difficulté est de vouloir le faire avec des tableaux ! Quand je vois ton code précédent avec des imbrications for/for/for/for/if/switch/if... c'est juste horrible et c'est pour ça que c'est dur.

Les Map et les Set sont exactement fait pour traiter ce genre de données :
  • une Map associe une clé avec sa valeur
  • un Set contient plusieurs valeurs

En les combinant, on a un Map<String, Set<String>> qui à chaque mot associe plusieurs autres mots.

Au final ça donne un code plutôt simple, la vraie question étant : est-ce que le résultat est correct ?

import java.util.*;

public class SynonymDico {
    private final Map<String, Set<String>> datas = new TreeMap<>();

    public void add(String first, String second) {
        Set<String> dataFirst = datas.get(first);
        Set<String> dataSecond = datas.get(second);
        if (dataFirst == null) {
            if (dataSecond == null) { // les deux mots sont nouveaux
                Set<String> data = new TreeSet<>();
                data.add(first);
                data.add(second);
                datas.put(first, data);
                datas.put(second, data);
            } else { // le premier mot est nouveau
                dataSecond.add(first);
                datas.put(first, dataSecond);
            }
        } else if (dataSecond == null) { // le deuxième mot est nouveau
            dataFirst.add(second);
            datas.put(second, dataFirst);
        } else if (dataFirst != dataSecond) { // les deux mots existent dans des groupes différents
            dataFirst.addAll(dataSecond);
            for (String elt : dataSecond)
                datas.put(elt, dataFirst);
        }
        System.err.println("add(" + first + ", " + second + ") => " + datas);
    }

    public Set<Set<String>> getValues() {
        return new LinkedHashSet<>(datas.values());
    }
}

Voici un code de test pour ton exemple :
public class Test {
    public static void main(String[] args) {
        SynonymDico dico = new SynonymDico();
        dico.add("Bonjour a tous", "Comment ca marche");
        dico.add("Hello", "Bonsoir");
        dico.add("Hi", "Bonjour a tous");
        dico.add("rouge", "Clavier");
        dico.add("Help", "ABC");
        dico.add("Help", "Jour");
        System.out.println(dico.getValues());
    }
}

Ce qui donne bien tes 2 lignes à 3 colonnes et tes 2 lignes à 2 colonnes :
[[ABC, Help, Jour], [Bonjour a tous, Comment ca marche, Hi], [Bonsoir, Hello], [Clavier, rouge]]

Remarque : les valeurs sont triées par ordre alphabétique (au sens Unicode) grâce aux TreeMap et TreeSet dans add() et à la conservation de l'ordre avec LinkedHashSet dans getValues().
nidhalos
Messages postés
10
Date d'inscription
vendredi 11 mai 2018
Dernière intervention
21 décembre 2018
-
merci KX ça marche bien ; avant votre dernière code j'ai aucun idée qu'li y a le type Map mais es ce que je peut ajouter tous les éléments seulement un par un :
dico.add("Bonjour a tous", "Comment ca marche");
dico.add("Hello", "Bonsoir");
dico.add("Hi", "Bonjour a tous");
dico.add("rouge", "Clavier");
dico.add("Help", "ABC");
dico.add("Help", "Jour")


sachant que mon tableau ' input ' a plus que 200 lignes
KX
Messages postés
15913
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
17 janvier 2019
3625 > nidhalos
Messages postés
10
Date d'inscription
vendredi 11 mai 2018
Dernière intervention
21 décembre 2018
-
Après, si tes données sont dans un tableau, tu peux faire une boucle pour faire des dico.add() pour chaque ligne. Mais en soit ça ne devrait rien changer au code de ma classe.

for (int i=0; i<tab1.length; i++)
    dico.add(tab1[i][0], tab1[i][1]);
Commenter la réponse de KX