Problème de gestion des matrices en java

[Résolu/Fermé]
Signaler
Messages postés
11
Date d'inscription
vendredi 11 mai 2018
Statut
Membre
Dernière intervention
4 mai 2019
-
Messages postés
16410
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 octobre 2021
-
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

1 réponse

Messages postés
16410
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 octobre 2021
2 901
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.
2
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 41713 internautes nous ont dit merci ce mois-ci

Messages postés
11
Date d'inscription
vendredi 11 mai 2018
Statut
Membre
Dernière intervention
4 mai 2019

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
Messages postés
16410
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 octobre 2021
2 901 >
Messages postés
11
Date d'inscription
vendredi 11 mai 2018
Statut
Membre
Dernière intervention
4 mai 2019

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().
Messages postés
11
Date d'inscription
vendredi 11 mai 2018
Statut
Membre
Dernière intervention
4 mai 2019

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
Messages postés
16410
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
24 octobre 2021
2 901 >
Messages postés
11
Date d'inscription
vendredi 11 mai 2018
Statut
Membre
Dernière intervention
4 mai 2019

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]);