IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

Afficher un tableau de chaîne en n'affichant qu'une seule fois les sorties identiques


Sujet :

Collection et Stream Java

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Afficher un tableau de chaîne en n'affichant qu'une seule fois les sorties identiques
    Bonjour, je ne sais pas trop si je suis clair avec le titre mais j'me lance. J'ai un bout d'algo, je dois afficher la liste des maChaine en n'affichant qu'une fois chaque chaine. Le tableau n'est pas trié.
    Voici la structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    unTableau : structure
    maChaine : chaine
    nombre : entier
    finstructure
     
    tableau[1..500] : tableau
    nbEntrees : entier // nombre de cases remplies dans tableau
    Au premier coup d'oeil ça me paraissait tranquille, j'avais lancé un truc comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public static void main(String[] args) {
    String tableau[] = new String[]{"1","2","3","1","5"};
     
    		for(int i = 0; i<tableau.length; i++){
    			System.out.println(lesConnexions[i]);
    Et en fait je ne vais jamais plus loin... J'arrive à sortir le contenu "string" de mon tableau et j'arrivais même à faire des comparaison avec if(tableau[i].equals(tableau[i+1]) (je sais que c'est incorrect)
    Auriez vous un algo ou le code Java pour que je puisse prendre tableau[i] et l'afficher uniquement si le string n'est pas déjà apparu?
    Merci d'avance pour le coup de main, c'est frustrant d'y passer une heure alors que ça paraît si simple.

  2. #2
    Membre confirmé Avatar de hugoclo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    615
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 615
    Points : 480
    Points
    480
    Par défaut
    Bonjour
    Pour mettre du code utiliser les balises c'est plus lisible et surtout c'est obligatoire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        String tableau[] = new String[]{"1","1","3","4","5"};
     
    Set<String> set = new LinkedHashSet<>(Arrays.asList(tableau ));
    String[] result = set.toArray(new String[set.size()]);
    for(int i = 0; i<result.length; i++){
    System.out.println(result[i]);

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 567
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 633
    Points
    21 633
    Par défaut
    Ou juste :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    List<String> list = Arrays.asList(tableau);
    for(String string : new LinkedHashSet<String>(list)) {
      System.out.println(string);
    }
    C'est plus simple et ça évite de copier les données dans un tableau redondant.

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    J'ai ajouté les balises pour rendre ça plus lisible, merci hugoclo.
    Et merci à vous deux, effectivement les deux solutions marchent niquel, mais j'ai du mal à les comprendre. En algo, qu'est ce que cela donnerais?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    List<String> list = Arrays.asList(tableau);
    for(String string : new LinkedHashSet<String>(list)) {
      System.out.println(string);
    }
    Je vais tout de même lire la javadoc tout de suite, ça s'éclaircira peut être tout seul dans ma tête

  5. #5
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 567
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 633
    Points
    21 633
    Par défaut
    Citation Envoyé par troufi Voir le message
    En algo, qu'est ce que cela donnerais?
    List<String> list = Arrays.asList(tableau); => Voir le tableau comme une List. (Pour la suite, on a besoin de le voir comme une Collection, et une List est une Collection, donc ça marche. C'est le moyen le plus simple.)

    new LinkedHashSet<String>(list) => Créer un nouveau LinkedHashSet et le remplir avec les éléments de la List.
    LinkedHashSet implémente Set, une structure prévue pour contenir des éléments, mais sans aucun duplicata. LinkedHashSet est une implémentation qui le fait, d'une part avec une table de hachage pour trouver rapidement si un élément est déjà dedans ou pas, d'autre part avec une liste chaînée qui retient dans quel ordre les éléments ont été insérés dedans.
    Donc, en y insérant tous les éléments d'une List, on obtient ces éléments dans le même ordre, mais sans doublon (un élément apparaît dans le LinkedHashSet lors de sa première apparition dans la List, par convention.)
    À noter qu'il n'y a pas de constructeur pour créer un LinkedHashSet et le remplir avec les éléments d'un tableau. C'est pour ça qu'on avait besoin de l'étape précédente pour fournir une List à la place.

    for(String string : new LinkedHashSet<String>(list)) { => Parcourir les éléments du LinkedHashSet ainsi créé.

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Bon j'avais écris un long mp mais m'demande pas pourquoi, il part pas. Mais j'dois te remercier d'une façon ou d'une autre.
    Bonjour thelvin, tu m'as répondus & aidé ici : http://www.developpez.net/forums/d14...es-identiques/
    J'ai déjà marqué le problème comme résolu et je n'ai pas de raison de faire remonter le sujet pour te dire merci alors je vais l'faire en message privé. Merci! ;D l'explication de LinkedHashSet était nécessaire, j'étais paumé dans la doc.
    En attendant j'ai fais ce que je voulais faire, sans utiliser de méthodes préfabriquées, ton explication m'a aidé à réfléchir.
    Une boucle for [i] pour parcourir le tableau, une deuxieme boucle for [k] imbriquée pour parcourir les valeurs situées après [i],
    si [i] apparaît plus d'une fois dans la boucle [k], count est incrémenté de un et la boucle [i] n'affiche pas sa valeur.
    Sinon, [i] est affiché, et toutes les valeurs sont affichées donc au moins une fois.

    Si j'avais le temps je réfléchirais à un moyen de rendre le truc beaucoup moins lourd, parce qu'on arrive vite à faire trop de calcul pour ce qu'on veut faire. Seulement mon exercice ne me demande pas d'avoir un programme optimisé, ni de sortie triée, par contre je ne suis pas censé avoir vu les collections dans mon cours, alors je voulais m'en passer... J'espère que ça plaira à mon prof.

    Bref j'suis assez content d'avoir réussi à faire un truc aussi simple, haha. J'te le montre par fierté.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    		public static void main(String[] args) {
    		// attributs
    		String tableau[] = new String[] { "1", "4", "5", "1", "3", "4",
    				"saucisson", "1", "4", "5", "1", "3", "4", "1", "4", "5", "1",
    				"3", "4", "io", "truc", "ENFIN!" };
    		int count = 0;
     
    		for (int i = 0; i < tableau.length; i++) {
    			count = 0;
    			for (int k = i; k < tableau.length; k++) {   //k = i
    				if (tableau[i].equals(tableau[k])) {
    					count++;                                // => si string du tableau[i] est égale à un string du
    								                       // tableau[k jusqu'à tableau.length], count ++
    				}
    			}
    			if (count == 1) {                                      // => si l'ip de la boucle [i] n'est apparu qu'une
    								                       // seule fois (là où [i] = [k]), afficher le
    								                       // contenu de [i] dans l'output
    				System.out.println("String unique : " + tableau[i]);
    			}
    		}
    	}
    (en copiant/collant mon code je l'ai relu et j'me demande pourquoi j'ai mis "k < lesConnexions.length" dans la boucle for[k]..." et pourquoi ça marche... Mais ouais ça marche et j'écrivais seulement pour dire merci. >_>)
    Alors encore merci thelvin, passe une bonne journée. (en prévisualisant j'me rends compte que j'ai écris un pavé. J'espère que t'as pas peur des livres ;D. Désolé.)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Afficher une seule fois les éléments d'un liste triée
    Par cry57 dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 16/03/2011, 17h10
  2. Réponses: 4
    Dernier message: 03/07/2009, 10h45
  3. [MySQL] afficher une seule fois les données redondantes
    Par ginger4957 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 20/05/2009, 17h04
  4. [MySQL] afficher une seule fois les réponses identiques
    Par Giantrick dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 30/05/2007, 13h35
  5. [XSLT] Afficher une seule fois les attributs redondants...
    Par kobe dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 17/11/2005, 10h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo