Menu

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

nidhalos 6 Messages postés vendredi 11 mai 2018Date d'inscription 22 mai 2018 Dernière intervention - 12 mai 2018 à 23:37 - Dernière réponse : KX 15440 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 23 mai 2018 Dernière intervention
- 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

5 réponses

KX 15440 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 23 mai 2018 Dernière intervention - Modifié par KX le 13/05/2018 à 00:50
+2
Utile
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.
nidhalos 6 Messages postés vendredi 11 mai 2018Date d'inscription 22 mai 2018 Dernière intervention - 13 mai 2018 à 01:00
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 15440 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 23 mai 2018 Dernière intervention > nidhalos 6 Messages postés vendredi 11 mai 2018Date d'inscription 22 mai 2018 Dernière intervention - 13 mai 2018 à 11:55
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 6 Messages postés vendredi 11 mai 2018Date d'inscription 22 mai 2018 Dernière intervention - 13 mai 2018 à 16:05
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 15440 Messages postés samedi 31 mai 2008Date d'inscriptionModérateurStatut 23 mai 2018 Dernière intervention > nidhalos 6 Messages postés vendredi 11 mai 2018Date d'inscription 22 mai 2018 Dernière intervention - 13 mai 2018 à 16:29
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