Problème de gestion des matrices en java
Résolu
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
-
ModérateurBonjour,
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.
-
-
Modérateur@nidhalosEn 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 -
Modérateur@nidhalosAprè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]);
-