Problème de gestion des matrices en java

Résolu/Fermé
nidhalos Messages postés 11 Date d'inscription vendredi 11 mai 2018 Statut Membre Dernière intervention 4 mai 2019 - 12 mai 2018 à 23:37
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 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
A voir également:

1 réponse

KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié le 13 mai 2018 à 00:50
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
nidhalos Messages postés 11 Date d'inscription vendredi 11 mai 2018 Statut Membre Dernière intervention 4 mai 2019
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
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015 > nidhalos Messages postés 11 Date d'inscription vendredi 11 mai 2018 Statut Membre Dernière intervention 4 mai 2019
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().
0
nidhalos Messages postés 11 Date d'inscription vendredi 11 mai 2018 Statut Membre Dernière intervention 4 mai 2019
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
0
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015 > nidhalos Messages postés 11 Date d'inscription vendredi 11 mai 2018 Statut Membre Dernière intervention 4 mai 2019
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]);
0