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 :

NullPointerException lors du tri d'une map


Sujet :

Collection et Stream Java

  1. #1
    Expert éminent sénior

    Avatar de snake264
    Homme Profil pro
    Datascientist chez Leboncoin
    Inscrit en
    Novembre 2006
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Datascientist chez Leboncoin
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 914
    Points : 13 312
    Points
    13 312
    Par défaut NullPointerException lors du tri d'une map


    J'ai un problème lors du tri de ma map par valeur, je tombe sur une exception NullPointerException et je n'arrive pas à voir où ce trouve mon erreur.

    Voici le code que j'utilise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public void display () {
    	List<String> keys = new ArrayList<> (this.list.keySet ());
     
    	Collections.sort (keys, new ValueComparator (this.list));
     
    	for (String str : keys){
    	    System.out.println ("string : " + str + " count : " + this.list.get (str));
    	}
    }
    Ma classe implémentant l'interface Comparator :

    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
    public class ValueComparator implements Comparator<String> {
        private Map<String, Integer> map;
     
        public ValueComparator (Map<String, Integer> map) {
    	this.map.putAll (map);
        }
     
        @Override
        public int compare (String sourceKey, String targetKey) {
    	int sourceValue = Integer.valueOf (this.map.get (sourceKey));
    	int targetValue = Integer.valueOf (this.map.get (targetKey));
     
    	if (sourceValue > targetValue) {
    	    return 1;
    	}
    	else if (sourceValue > targetValue) {
    	    return -1;
    	}
     
    	return 0;
        }
    }
    Une idée de ce que j'aurai fait de traver ?

    par avance

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 560
    Points : 21 622
    Points
    21 622
    Par défaut
    Le plus simple est de regarder la stacktrace de l'exception : elle te dit à quel endroit et à quelle ligne l'exception est survenue.

    Donc, avec ton code, cela arrive probablement ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public ValueComparator (Map<String, Integer> map) {
      this.map.putAll (map);
    }
    Tu n'as pas initialisé this.map, qui donc est null, et appeler une méthode dessus (que ce soit putAll() ou quoi que ce soit) génèrera un NullPointerException.


    À part ça :
    - je vois au moins un bug évident dans le comparateur,
    - je ne vois pas l'intérêt de Integer.valueOf().

  3. #3
    Expert éminent sénior

    Avatar de snake264
    Homme Profil pro
    Datascientist chez Leboncoin
    Inscrit en
    Novembre 2006
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Datascientist chez Leboncoin
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 914
    Points : 13 312
    Points
    13 312
    Par défaut
    exact c'était bien ça. Le bug en effet je faisais deux fois la même comparaison, et pour la seconde remarque parce que c'est plus naturel pour moi de manipuler des int

    bien pour ton aide

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Je rajouterais ceci:

    1) pourquoi créer une nouvelle map alors que la map existante suffit?
    2) pourquoi tout ce bordel dans compare alors qu'il est identique à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        public int compare (String sourceKey, String targetKey) {
            return map.get (sourceKey).compareTo(map.get (targetKey));
        }
    et que donc au final ton code peux se résumer à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public void display () {
    	List<String> keys = new ArrayList<> (this.list.keySet ());
     
    	Collections.sort (keys, new Comparator<String> (this.list){
                   @Override
                   public int compare (String o1, String o2) {
                         return list.get(o1).compareTo(list.get(o2));
                   }
    	});
     
    	for (String str : keys){
    	    System.out.println ("string : " + str + " count : " + this.list.get (str));
    	}
    }
    3) c'est une très mauvaise idée d'appeler ta map "list", écrire
    C'est une aussi mauvaise idée que d'écrire
    Ca rend le code très dur à lire

  5. #5
    Expert éminent sénior

    Avatar de snake264
    Homme Profil pro
    Datascientist chez Leboncoin
    Inscrit en
    Novembre 2006
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Datascientist chez Leboncoin
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 914
    Points : 13 312
    Points
    13 312
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    1) pourquoi créer une nouvelle map alors que la map existante suffit?
    C'est-à-dire ?

    Citation Envoyé par tchize_ Voir le message
    2) pourquoi tout ce bordel dans compare alors qu'il est identique à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        public int compare (String sourceKey, String targetKey) {
            return map.get (sourceKey).compareTo(map.get (targetKey));
        }
    Exact, je suppose que la méthode "compareTo" vient de l'interface "Comparable" c'est ça ?

    Citation Envoyé par tchize_ Voir le message
    et que donc au final ton code peux se résumer à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public void display () {
    	List<String> keys = new ArrayList<> (this.list.keySet ());
     
    	Collections.sort (keys, new Comparator<String> (this.list){
                   @Override
                   public int compare (String o1, String o2) {
                         return list.get(o1).compareTo(list.get(o2));
                   }
    	});
     
    	for (String str : keys){
    	    System.out.println ("string : " + str + " count : " + this.list.get (str));
    	}
    }
    Non car mon but est de me faire un comparateur générique, qui prenant une map contenant n'importe quel type de valeurs, là j'ai pris String juste pour avoir quelque chose de précis à tester.

    Citation Envoyé par tchize_ Voir le message
    3) c'est une très mauvaise idée d'appeler ta map "list", écrire
    C'est une aussi mauvaise idée que d'écrire
    Ca rend le code très dur à lire
    Je sais mais quand je développe un petit truc exclusivement réservé à mon usage personnel et que personne d'autres n'utilisera je ne fais pas attention à ce genre de chose

    Si je prévois de le publier ou de le donner à quelqu'un d'autre oui je nommerai mieux et je commenterai (car je commente que très rarement mes codes perso aussi). Mais quand je code pour moi je code très salement d'une manière souvent que ya que moi qui comprenne

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

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

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Points : 48 804
    Points
    48 804
    Par défaut
    Citation Envoyé par snake264 Voir le message
    C'est-à-dire ?
    Que tu fais une copie de la map qu'on te passe (création d'une nouvelle map puis appel de addAll) alors que tu ne la modifie pas -> conserve celle qu'on te passe tout simplement.

    Exact, je suppose que la méthode "compareTo" vient de l'interface "Comparable" c'est ça ?
    oui

  7. #7
    Expert éminent sénior

    Avatar de snake264
    Homme Profil pro
    Datascientist chez Leboncoin
    Inscrit en
    Novembre 2006
    Messages
    2 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Datascientist chez Leboncoin
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 914
    Points : 13 312
    Points
    13 312
    Par défaut
    C'est vrai, si j'utilise compareTo je n'ai plus besoin de copier la map

    en tout cas pour tes conseils et remarques

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 29/05/2008, 18h14
  2. Ne pas définir d'opérateur de tri dans une map
    Par Muetdhiver dans le forum SL & STL
    Réponses: 5
    Dernier message: 14/11/2007, 14h38
  3. Mauvais focus lors du tri d'une colonne sur un datagrid
    Par Scorpi0 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 24/10/2007, 14h18
  4. [1.5] Tri d'une Map
    Par Arnaud F. dans le forum Collection et Stream
    Réponses: 20
    Dernier message: 27/05/2007, 15h34
  5. Warning lors d'un tri d'une liste
    Par basket dans le forum Langage
    Réponses: 3
    Dernier message: 07/09/2006, 16h35

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