Problème de gestion des matrices en java
Résolu
nidhalos
Messages postés
13
Statut
Membre
-
KX Messages postés 19031 Statut Modérateur -
KX Messages postés 19031 Statut Modérateur -
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
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
-
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.
-
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
- 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().
-
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
-