Partage
  • Partager sur Facebook
  • Partager sur Twitter

Trier un tableau de String

Anonyme
    25 septembre 2014 à 18:09:37

    Bonjour, 

    Je souhaite trier un tableau de string d'une façon un peu spécial. Imaginons que j'ai le tableau suivant : 

    String[] tab = {"Raaata", "Tatatara", "Ratatouille", "Gygyghhhygra"};

    J'aimerais trier le tableau par les mots qui commencent par la gauche par "ra" puis par ceux qui contiennent "ra", c-a-d trier en fonction de la position de "ra" dans le mot, de la gauche vers la droite.

    Donc ca devrait donner : Raaata, Ratatouille, Tatatara, Gygyghhhygra.

    J'espère être clair et que vous pourrez m'aider ! :)

    • Partager sur Facebook
    • Partager sur Twitter
      25 septembre 2014 à 21:40:45

      francoiscollombon a écrit:

      Bonjour, 

      Je souhaite trier un tableau de string d'une façon un peu spécial. Imaginons que j'ai le tableau suivant : 

      String[] tab = {"Raaata", "Tatatara", "Ratatouille", "Gygyghhhygra"};

      J'aimerais trier le tableau par les mots qui commencent par la gauche par "ra" puis par ceux qui contiennent "ra", c-a-d trier en fonction de la position de "ra" dans le mot, de la gauche vers la droite.

      Donc ca devrait donner : Raaata, Ratatouille, Tatatara, Gygyghhhygra.

      J'espère être clair et que vous pourrez m'aider ! :)

      Bonjour,

      Il faut utiliser un comparateur spécifique pour trier le tableau.

      En utilisant la position de la première occurrence de "ra", on obtient quelque chose comme ça :

      import java.util.*;
      import java.lang.*;
      import java.io.*;
      import java.util.Arrays;
      
      class Ideone
      {
      	public static void main (String[] args) throws java.lang.Exception
      	{
      		final String[] data = new String[] {"Raaata", "Tatatara", "Ratatouille", "Gygyghhhygra", "Bla", "Toto"};
      		Arrays.sort(data, new Comparator<String>() {
          		public int compare(String s1, String s2) {
          			int idx1 = s1.toLowerCase().indexOf("ra");
          			int idx2 = s2.toLowerCase().indexOf("ra");
          			if(idx1 == -1) {
          				idx1 = Integer.MAX_VALUE;
          			}
          			if(idx2 == -1) {
          				idx2 = Integer.MAX_VALUE;
          			}
          			Integer i1 = new Integer(idx1);
          			Integer i2 = new Integer(idx2);
              		return i1.compareTo(i2);
          		}
      		});
      		System.out.println("Sorted array=" + Arrays.toString(data));
      	}
      }

      Se reporter à la javadoc pour String.indexOf et pour l'interface Comparator : http://www.iro.umontreal.ca/~dift1020/cours/ift1020/communs/Cours/C10/ComparableComparator.pdf


      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        28 septembre 2014 à 20:09:18

        Merci beaucoup ! Cela fonctionne parfaitement mais il faudrait les trier en plus par ordre alphabétique après les "ra".

        Et si ce n'est pas un tableau mais une arrayList ? Comment faire ? 

        Merci beaucoup d'avance !

        Bien à vous.

        • Partager sur Facebook
        • Partager sur Twitter
          28 septembre 2014 à 20:31:12

          Bonsoir.

          http://docs.oracle.com/javase/8/docs/api/java/util/List.html#sort-java.util.Comparator-
          http://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#sort-java.util.List-java.util.Comparator-

          • Partager sur Facebook
          • Partager sur Twitter
          Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
            30 septembre 2014 à 0:45:56

            francoiscollombon a écrit:

            Et si ce n'est pas un tableau mais une arrayList ? Comment faire ?


            Ca ne change quasiment rien, cf les liens du post au-dessus.

            francoiscollombon a écrit:

            Merci beaucoup ! Cela fonctionne parfaitement mais il faudrait les trier en plus par ordre alphabétique après les "ra".

            Et si ce n'est pas un tableau mais une arrayList ? Comment faire ?

            Même principe, il faut modifier le Comparator suivant ce que l'on souhaite faire.

            Par exemple :

            import java.util.*;
            import java.lang.*;
            import java.io.*;
            import java.util.Arrays;
             
            class Ideone
            {
                public static void main (String[] args) throws java.lang.Exception
                {
                    final String[] data = new String[] {"Raaata", "Tatatara", "Ratatouille", "Gygyghhhygra", 
                    	"Rasatouille", "Paratouille", "Parasouille", "Bla", "Toto"};
                    Arrays.sort(data, new Comparator<String>() {
                    	@Override
                        public int compare(String s1, String s2) {
                            int idx1 = s1.toLowerCase().indexOf("ra");
                            int idx2 = s2.toLowerCase().indexOf("ra");
                            if(idx1 == -1 || idx2 == -1) {
                            	if(idx1 == -1) {
                                	idx1 = Integer.MAX_VALUE;
                            	}
                            	if(idx2 == -1) {
                                	idx2 = Integer.MAX_VALUE;
                            	}
                            } else if(idx1 == idx2) {
                            	return s1.substring(idx1).compareTo(s2.substring(idx2));
                            }
                            
                            Integer i1 = new Integer(idx1);
                            Integer i2 = new Integer(idx2);
                            return i1.compareTo(i2);
                        }
                    });
                    System.out.println("Sorted array=" + Arrays.toString(data));
                }
            }




            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              30 septembre 2014 à 16:25:10

              Merci bcp ! J'ai trouvé si c'est une ArrayList ! Mais encore une dernière question : 

              en plus de toutes les contraintes mentionnées au dessus, il faut les trier par ordre d'alphabétique de début, donc si on trie par "ra"

              -> ara

              -> bra

              -> cra

              ->...

              -
              Edité par Anonyme 30 septembre 2014 à 23:14:45

              • Partager sur Facebook
              • Partager sur Twitter
                30 septembre 2014 à 17:03:54

                L'interface Comparator permet de définir des "fonction"s de tri.
                Tu définies ton ordre selon tes propres critères.
                Ensuite son utilisation est identique quel que soit l'implémentation du Comparator.
                • Partager sur Facebook
                • Partager sur Twitter
                Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
                Anonyme
                  30 septembre 2014 à 23:14:05

                  Je n'ai pas vraiment compris...
                  • Partager sur Facebook
                  • Partager sur Twitter
                    30 septembre 2014 à 23:40:01

                    Tu définies tes Comparator comme tu veux

                    Comparator<String> comparator1 = (s1, s2) -> {
                        ...
                    };
                    
                    Comparator<String> comparator2 = (s1, s2) -> {
                        ...
                    };

                    ... ensuite les utilisations sont toujours identiques quelque soit l'implémentation :

                    Arrays.sort(data, comparator1);
                    Arrays.sort(data, comparator2);
                    Collections.sort(data, comparator1);
                    Collections.sort(data, comparator2);
                    ...

                     Dans ton cas il suffit de définir tes contraintes de tri dans les Comparator.

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
                    Anonyme
                      3 octobre 2014 à 14:32:30

                      Merci bcp ! Mais Slaithes peut tu expliquer ton code ? Merci d'avance !
                      • Partager sur Facebook
                      • Partager sur Twitter
                        4 octobre 2014 à 22:42:05

                        francoiscollombon a écrit:

                        Merci bcp ! Mais Slaithes peut tu expliquer ton code ? Merci d'avance !

                        Pour trier une liste d'objets, il faut "une relation d'ordre", il faut un moyen de pouvoir comparer deux objets.

                        int compare(T o1,
                                  T o2)
                        
                        Retourne un entier négatif (<0), zéro ou un entier positif (>0) si le premier argument est plus petit, égale à ou plus grand que le deuxième argument.
                        

                        Les règles que j'ai utilisées :

                        • on compare suivant la position de la chaîne "ra"
                        • traitement spécial si la chaîne n'existe pas
                        • si la position est identique dans les deux mots, on compare suivant les autres lettres après "ra"
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Trier un tableau de String

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown