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 :

Tri d'un tableau caractère par caractère entre la 1ère ligne la 2ème ligne


Sujet :

Collection et Stream Java

  1. #1
    Membre habitué Avatar de cashmoney
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Points : 149
    Points
    149
    Par défaut Tri d'un tableau caractère par caractère entre la 1ère ligne la 2ème ligne
    bonjour,
    je me casse la tête sur le tri d'un tableau par ordre croissant ligne par ligne et caractère par caractère. Je vous met un exemple de reponse mais je l'ai pas trouvé ainsi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Voici le contenu de votre tableau : 
     TabTri[0] = 9111
     TabTri[1] = 1944
     TabTri[2] = 4492
     TabTri[3] = 2229
     
     Voici le contenu de votre tableau après le tri : 
     TabTri[0] = 1111
     TabTri[1] = 2222
     TabTri[2] = 4444
     TabTri[3] = 9999
    Merci de votre aide, je donne plus bas les fonctions utilisées et le programme principal

    mon code est un peut en vrac avec 2 fonctions en plus du programme principal

    fonction echanger

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    private static void echanger(String[] nbr, int jechange) 
    {
    String sauvegarde = nbr[jechange];
    nbr[jechange] = nbr[jechange + 1];
    nbr[iechange + 1] = sauvegarde;
    }
    fonction tri
    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
    24
    25
     
    private static void triNumeric(String[] nbr, int nb) 
    {
    boolean inverse; // vrai si on effectue au moins une inversion de
    // deux éléments dans la petite boucle, c'est-à-dire si le tableau n'est
    // pas encore complètement trié
    do {
    inverse = false;
    for (int i = 0; i < nb - 1; i++)
     // du premier à l'avant-dernier élément
    {
    for (int j=0; j < nbr[i].length()-1; j++)
    {
    if (nbr[j].charAt(j) > nbr[j + 1].charAt(j + 1)) 
    // test des éléments caractère par caractère, si plus grand que
    //son successeur
    {
    inverse = true; // le tableau n'est pas encore ordonné
    echanger(nbr, j);
    }
    }
    }
    } while (inverse); // trier tant qu'il reste des éléments non
    // ordonnés, donnant lieu à des inversions
    }

    programme principal
    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    final static int MAXLIG = 4;
     
    public static void main(String[] argument) throws IOException
     
    {
    int index;
    String chaine;
    String[] tabTri = new String[MAXLIG];
    index = 0;
    do 
    {
    System.out.print(" Entrer les 4 Nombres de la " + (index + 1)
    + "è ligne de votre tableau de : ");
    Scanner sc = new Scanner(System.in);
    chaine = sc.nextLine();
    chaine = chaine.trim();
    if (chaine.length() > MAXLIG) 
    {
    chaine = chaine.substring(0, MAXLIG);
    }
    tabTri[index] = chaine;
    index++;
    } while (index < MAXLIG);
    System.out.println();
    System.out.println(" Voici le contenu de votre tableau : ");
    for (index = 0; index < MAXLIG; index++) 
    {
    System.out.println(" TabTri[" + index + "] = " + tabTri[index]);
    }
    //appel de ma fonction tri
    triNumeric(tabTri, MAXLIG);
    System.out.println();
    System.out.println(" Voici le contenu de votre tableau après le tri : ");
    for (index = 0; index < MAXLIG; index++) 
    {
    System.out.println(" TabTri[" + index + "] = " + tabTri[index]);
    }
    EXECUTION
    après exécution, il se passe rien. aucun tri, rien n'a changé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Voici le contenu de votre tableau : 
     TabTri[0] = 9111
     TabTri[1] = 1944
     TabTri[2] = 4492
     TabTri[3] = 2229
     
     Voici le contenu de votre tableau après le tri : 
     TabTri[0] = 9111
     TabTri[1] = 1944
     TabTri[2] = 4492
     TabTri[3] = 2229
    THE CHANGE

    Toujours en quête de connaissance

    WINDOWS :Oracle 11G, SQL DEVELOPER 2.2, Eclipse Ganymede 3.4 plugins VE 1.4, Flex 4

    MAC OsX 10.6.5 : Oracle 10G R2 SQL DEVELOPER 1.5.4, Eclipse Helios 3.6, plugins VE 1.4, Flex 4

  2. #2
    Membre éclairé

    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 510
    Points : 803
    Points
    803
    Par défaut
    attend, si j'ai bien compris, tu as un tableau d'Integer et tu veux le trier par ordre croissant c'est ca ? ou alors tu peux avoir n'importe quel char ?
    "La seule chose dont je sois certain, c'est que je doute"
    j'ai cassé ma boule de cristal veuillez être clair et précis dans vos propos
    compilateur - 1 nayah - 0
    PS : je suis un

  3. #3
    Membre habitué Avatar de cashmoney
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Points : 149
    Points
    149
    Par défaut
    En fait, c'est une chaine mais on veut que des nombres, je veux d'abords tester et voir si ça marche, ensuite gérer les exception si on entre au clavier des lettres.

    Pour l'instant j'en suis pas là, juste testé si ça marche avec une démo de nombres et gérer les exceptions plutard.
    Merci
    THE CHANGE

    Toujours en quête de connaissance

    WINDOWS :Oracle 11G, SQL DEVELOPER 2.2, Eclipse Ganymede 3.4 plugins VE 1.4, Flex 4

    MAC OsX 10.6.5 : Oracle 10G R2 SQL DEVELOPER 1.5.4, Eclipse Helios 3.6, plugins VE 1.4, Flex 4

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for (int j=0; j < nbr[i].length()-1; j++)
    {
    if (nbr[j].charAt(j) > nbr[j + 1].charAt(j + 1))
    ce test est mauvais. Imaginons que tu aies:

    1. 4321
    2. 1234


    tu va boucler de 0 à 3
    1. 4>1, on échange, on obtiens donc 1234/4321
    2. 2<3, on ne fait rien 1234/4321
    3. 3>2, on échange et on obtiens 4321/1234
    4. 1<4, on ne fait rien


    résultat après tri et deux échanges:
    1. 4321
    2. 1234


    et au final, ton algo ne va faire qu'ordonner par paire, sur le dernier symbole. Tu dois normalement sortir de ta boucle la plus intérieur dès que tu as un échange, pour ne pas rééchanger par la suite. (commande break; juste après le inverse())

  5. #5
    Membre éclairé

    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 510
    Points : 803
    Points
    803
    Par défaut
    bon alors pour être sur de n'avoir que des nombres : NumberFormatException

    ensuite: ta fonction de tri :

    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
     
    String[] tab;
    //la tu remplis ton tableau en entourant l'action par un try-catch (tu catch NumberFormatException)
     
    //tri du tableau :
     
    private void tri(String[] tab) {
        ArrayList<Integer> liste=new ArrayList<Integer>();
        for(String str : tab) {
            liste.add(Integer.parseInt(str));
        }
        Collections.sort(liste);
         int j=0;
        for(Integer i : liste) {
            tab[j] = String.valueOf(i);
            j++;
        }
    }
    ca devrait marcher
    "La seule chose dont je sois certain, c'est que je doute"
    j'ai cassé ma boule de cristal veuillez être clair et précis dans vos propos
    compilateur - 1 nayah - 0
    PS : je suis un

  6. #6
    Membre habitué Avatar de cashmoney
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Points : 149
    Points
    149
    Par défaut
    Merci pour vos reponses, dis moi nolofinwe il n'y a pas un moyen de le faire sans Arraylist et Collections.sort?? Merci

    Au fait, tchize si mes tests sont mauvais, que me proposes-tu?

    j'ai testé ça, pareil, j'obtiens rien de spécial, l'exécution m'affiche la même reponse. pas de tri effectué.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for (int i = 0; i < nb - 1; i++) 
    {
    for (int j=1; j < nb; j++)
    {
    if (nbr[i].charAt(i) > nbr[j].charAt(j)) 
    {
    THE CHANGE

    Toujours en quête de connaissance

    WINDOWS :Oracle 11G, SQL DEVELOPER 2.2, Eclipse Ganymede 3.4 plugins VE 1.4, Flex 4

    MAC OsX 10.6.5 : Oracle 10G R2 SQL DEVELOPER 1.5.4, Eclipse Helios 3.6, plugins VE 1.4, Flex 4

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    met déjà compare(x,y) dans une méthode à part, ca t'évitera de faire de swap en plein milieu de la comparaison et de continuer la comparaison après. Quand a la suggestion, regarde du coté des algos bubble sort pour commencer.

  8. #8
    Membre habitué Avatar de cashmoney
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Points : 149
    Points
    149
    Par défaut
    Merci, c'est pas bien clair compare(x,y) dans une méthode à part?? j'arrive pas à me faire l'idée du code, mais j'y réfléchis.
    Merci
    THE CHANGE

    Toujours en quête de connaissance

    WINDOWS :Oracle 11G, SQL DEVELOPER 2.2, Eclipse Ganymede 3.4 plugins VE 1.4, Flex 4

    MAC OsX 10.6.5 : Oracle 10G R2 SQL DEVELOPER 1.5.4, Eclipse Helios 3.6, plugins VE 1.4, Flex 4

  9. #9
    Membre habitué Avatar de cashmoney
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Points : 149
    Points
    149
    Par défaut
    ppfff, j'ai réfléchi, mais j'ai rien trouvé qui puisse décanter ma situation, merci à vous
    THE CHANGE

    Toujours en quête de connaissance

    WINDOWS :Oracle 11G, SQL DEVELOPER 2.2, Eclipse Ganymede 3.4 plugins VE 1.4, Flex 4

    MAC OsX 10.6.5 : Oracle 10G R2 SQL DEVELOPER 1.5.4, Eclipse Helios 3.6, plugins VE 1.4, Flex 4

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2006
    Messages : 43
    Points : 56
    Points
    56
    Par défaut Voici sans array list ni collection sort
    ce n'est pas le plus performat surtout au niveau du swap
    mais voici un code à l'ancienne avec quelques boucles

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    public class TestSort {
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		String[] tabTri = new String[4];
    		tabTri[0] = "9111";
    		tabTri[1] = "1934";
    		tabTri[2] = "4492";
    		tabTri[3] = "2229";
     
    		/* parcourir les élément du tableau */
    		for (int line = 0; line < tabTri.length; line++) {
    			for (int row = 0; row < tabTri[line].length(); row++) {
    				System.out.println(tabTri[line].charAt(row) + " coord " + line + " " + row + " length "
    						+ tabTri[line].length());
    				/* sort */
    				int nextElemeRow = row;
    				int nextElemeLine = line;
    				while (true) {
    					nextElemeRow++;
    					if (nextElemeRow >= tabTri[line].length()) {
    						nextElemeRow = 0;
    						nextElemeLine++;
    						if (nextElemeLine >= tabTri.length) {
    							System.out.println("end of process");
    							break;
    						}
    					}
    					if (tabTri[line].charAt(row) > tabTri[nextElemeLine].charAt(nextElemeRow)){
    						/* Swap value */
    						if(line == nextElemeLine){
    							StringBuffer sbold = new StringBuffer(tabTri[line]);
    							char mySwapChar = tabTri[line].charAt(row);
    							sbold.setCharAt(row,tabTri[nextElemeLine].charAt(nextElemeRow));
    							sbold.setCharAt(nextElemeRow,mySwapChar);
    							tabTri[line]=sbold.toString();							
    						}else{
    							StringBuffer sbold = new StringBuffer(tabTri[line]);
    							StringBuffer sbnew = new StringBuffer(tabTri[nextElemeLine]);
    							char mySwapChar = tabTri[line].charAt(row);
    							sbold.setCharAt(row,tabTri[nextElemeLine].charAt(nextElemeRow));
    							tabTri[line]=sbold.toString();	
    							sbnew.setCharAt(nextElemeRow,mySwapChar);
    							tabTri[nextElemeLine]=sbnew.toString();	
    						}
    					}
    					System.out.println(" check if " + tabTri[line].charAt(row) + " > " + tabTri[nextElemeLine].charAt(nextElemeRow));
     
     
    				}
    			}
    		}
     
    		System.out.println("the result");
    		/* parcourir les élément du tableau */
    		for (int line = 0; line < tabTri.length; line++) {
    			System.out.println(tabTri[line]);
    		}
    	}
     
    }

    A+

    P.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Salut,
    Si tu veux travailler avec des nombres, pourquoi n'utilises tu pas la fonction nextInt de ta classe scanner ? Et un nombre de moins de 5 chiffres est tout simplement n < 10000. Ca facilitera grandement tes tests dans ton algorithme de comparer des entiers...

  12. #12
    Membre habitué Avatar de cashmoney
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Points : 149
    Points
    149
    Par défaut
    Merci à vous tous, mon soucis s'est décanter. merci surtout à parou
    THE CHANGE

    Toujours en quête de connaissance

    WINDOWS :Oracle 11G, SQL DEVELOPER 2.2, Eclipse Ganymede 3.4 plugins VE 1.4, Flex 4

    MAC OsX 10.6.5 : Oracle 10G R2 SQL DEVELOPER 1.5.4, Eclipse Helios 3.6, plugins VE 1.4, Flex 4

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

Discussions similaires

  1. [Débutant] Lecture caractère par caractère
    Par boober31 dans le forum Débuter
    Réponses: 10
    Dernier message: 28/09/2007, 15h52
  2. Réponses: 22
    Dernier message: 10/04/2007, 12h33
  3. Réponses: 18
    Dernier message: 17/01/2007, 13h49
  4. Réponses: 6
    Dernier message: 16/12/2006, 16h08
  5. Réponses: 10
    Dernier message: 19/06/2006, 20h04

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