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

avec Java Discussion :

Trier une liste suivant un critère


Sujet :

avec Java

  1. #1
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 50
    Points : 52
    Points
    52
    Par défaut Trier une liste suivant un critère
    Bonjour à tous,

    J'ai actuellement une liste de String, que j'aimerais trier suivant un critère.

    Voici mon début de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    List<String> subList;
    subList = tabNDF.subList(borne2, borne1); //je récupère un certain nombre d'éléments d'un tableau Par exemple, de la ligne 13 à 38 du tableau tabNDF
    Chaque ligne de subList se compose ainsi :

    20318880 000006.00 TRAIN
    20312350 000008.00 VOITURE
    20456780 000009.00 TRAIN
    [...]

    Je voudrai trier ma subList sur les caractères 22 à 30 (TRAIN, VOITURE....).

    Ainsi ma subList devrait être trié :

    20318880 000006.00 TRAIN
    20456780 000009.00 TRAIN
    20312350 000008.00 VOITURE

    J'ai vu qu'il fallait utilisé Collections.sort() avec Compare ou Comparable, mais je n'ai pas compris comment le faire.

    Si vous pouviez m'aider, ça serait cool

    Merci

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 552
    Points : 21 608
    Points
    21 608
    Par défaut
    Hello,

    Par exemple, si tu voulais trier par dernier caractère de chaque String :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    List<String> list = Arrays.asList("aaZ", "aaaaA", "aW", "aaaaX");
     
    // on affiche la liste telle que créée.
    System.out.println(list);
     
    // on trie la liste
    Collections.sort(list, (String s1, String s2) -> {
      String last1 = s1.substring(s1.length()-1);
      String last2 = s2.substring(s2.length()-1);
      return last1.compareTo(last2);
    });
     
    // On affiche après tri
    System.out.println(list);
    La notation (String s1, String s2) -> { ... } est une expression lambda, qui représente le Comparator qu'il faut utiliser pour le tri :
    elle prend en paramètre deux String, et indique laquelle doit être classée avant l'autre, en se terminant par un return qui renvoie la comparaison qu'on voulait vraiment (dans mon exemple, la comparaison entre les derniers caractères des deux Strings.)


    À noter, attention, que la List renvoyée par subList() est dite "vivante", c'est-à-dire qu'elle est encore liée à la List sur laquelle on a appelé subList(). Toute modification de la sous-liste affectera aussi la liste de départ.
    Donc si tu tries la sous-liste avec Collections.sort(), cette portion de la liste de début, se retrouvera triée aussi.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 50
    Points : 52
    Points
    52
    Par défaut
    Donc de ce que je comprends je fais :

    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
     
    List<String> subList;
    subList = tabNDF.subList(borne2, borne1);
     
    Collections.sort(subList, ??);
     
    //fin de la méthode
     
    //nouvelle méthode
    public int Comparator(String s1, String s2)
    {
    String last1 = s1.substring(20,30);
    String last2 = s2.substring(20,30);
    return last1.compareTo(last2);
    }
    Qu'est-ce que je dois mettre dans le Collections.sort(...) ?

  4. #4
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 075
    Points : 7 981
    Points
    7 981
    Par défaut
    Ce que Thelvin a proposé

    Peut être que le fait qu'il ait codé pour java 8 ne te plait pas.

    voici un équivalent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    // on trie la liste
    Collections.sort(list, new Comparator<String>()
    {
    	@Override
    	public int compare(String s1, String s2)
    	{
    		String last1 = s1.substring(s1.length() - 1);
    		String last2 = s2.substring(s2.length() - 1);
    		return last1.compareTo(last2);
    	}
    });
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 50
    Points : 52
    Points
    52
    Par défaut
    Ah oui, on va dire que c'était le java 8 :p

    Merci, c'est top

  6. #6
    Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Octobre 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2012
    Messages : 50
    Points : 52
    Points
    52
    Par défaut
    Tant que vous êtes chaud, j'ai une suite à vous proposer :p

    J'aimerais ensuite sommer les montants des lignes qui ont le même type de dépense :

    De :
    20318880 000006.00 TRAIN
    20318880 000009.00 TRAIN
    20312350 000008.00 VOITURE

    On passerait à :
    20318880 0000015.00 TRAIN
    20312350 000008.00 VOITURE

    Est-ce que je peux le faire en même temps que le tri, ou je dois ensuite reparcourir ma subList ? Comment faire ?

  7. #7
    Modérateur
    Avatar de wax78
    Homme Profil pro
    Chef programmeur
    Inscrit en
    Août 2006
    Messages
    4 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chef programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 4 075
    Points : 7 981
    Points
    7 981
    Par défaut
    Déjà je te conseillerais peut être de crée un objet pour tes élément de la liste tu aurais plus facile.

    Ensuite je crois pas que le tri change les choses pour ce que tu demande (a savoir calculé un somme sur des objets groupés qui trié ou non ne changera pas la somme).

    Ensuite, en 1 ligne de java 8 tu auras une map avec comme clé le nom du type de transport (?) ainsi que le cumul des prix (?) par exemple :

    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
     
    class Element14{
    	public int ID;
    	public double prix;
    	public String nom;
     
    	public Element14(int iD, double prix, String nom) {
    		super();
    		ID = iD;
    		this.prix = prix;
    		this.nom = nom;
    	}
     
    	public int getID() {
    		return ID;
    	}
     
    	public void setID(int iD) {
    		ID = iD;
    	}
     
    	public double getPrix() {
    		return prix;
    	}
     
    	public void setPrix(double prix) {
    		this.prix = prix;
    	}
     
    	public String getNom() {
    		return nom;
    	}
     
    	public void setNom(String nom) {
    		this.nom = nom;
    	}
     
     
    };
     
    Collection<Element14> datas = Arrays.asList(
    		new Element14(20318880, 000006.00f, "TRAIN"),
    		new Element14(20312350, 000008.00f, "VOITURE"),
    		new Element14(20318880, 000009.00f, "TRAIN")
     
    );
     
    //Groupe d'abord par nom pour creer un list de chaque type de nom. Ensuite pour chacune des liste, effectue une somme de la variable "prix" et place le resultat dans la map finale
    Map<String, Double> prixCumule = datas.stream().collect(Collectors.groupingBy(Element14::getNom, Collectors.summingDouble(Element14::getPrix)));
    // Meme chose mais avec le tri avant (qui pour moi ne sert a rien dans ce cas ci)
    //Map<String, Double> prixCumule = datas.stream().sorted((Element14 a, Element14 b) -> a.nom.compareTo(b.nom)).collect(Collectors.groupingBy(Element14::getNom, Collectors.summingDouble(Element14::getPrix)));
    // Puis faire quelques choses des données.
    prixCumule.forEach((u,k) -> System.out.println(u+ " Cumul prix = "+k));
    (Les "ça ne marche pas", même écrits sans faute(s), vous porteront discrédit ad vitam æternam et malheur pendant 7 ans)

    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Trier une liste suivant 2 critères
    Par stueur666 dans le forum Excel
    Réponses: 2
    Dernier message: 07/02/2012, 16h54
  2. Réponses: 13
    Dernier message: 03/12/2007, 18h06
  3. Réponses: 22
    Dernier message: 19/09/2005, 14h49
  4. [c#] Trier une liste de nombres liés.
    Par Joad dans le forum ASP.NET
    Réponses: 13
    Dernier message: 11/05/2005, 11h17
  5. [Debutant(e)]Trier une liste
    Par LeDébutantJava dans le forum Collection et Stream
    Réponses: 8
    Dernier message: 19/08/2004, 12h44

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