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

Composants Java Discussion :

[rowSorter] Trier les doubles avec un rowSorter


Sujet :

Composants Java

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 10
    Points : 8
    Points
    8
    Par défaut [rowSorter] Trier les doubles avec un rowSorter
    Salut,

    Je suis débutant en Java, et pour un stage je dois réaliser un plug-in ImageJ faisant apparaître une JTable contenant uniquement des valeurs numériques (int et double). J'essaye de permettre à l'utilisateur de trier ses colonnes via le rowsorter, cependant celui-ci semble prendre en compte mes données comme des String, du coup il les tri de la manière suivante :

    1-2-8-10-100-4-25-7 ---> 1 - 10 - 100 - 2 - 25 - 4 -7 - 8 (et je cherche à avoir : 1 - 2 - 4 - 7 - 8 - 10 - 25 - 100.

    J'ai réussi pour les int en faisant ceci (trouvé sur internet) :

    En bas de ma class :

    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
    	class NumeroPositionComparator implements Comparator<String> {
    		@Override
    		public int compare(String no1, String no2) {
    			Integer numero1 = null;
    			boolean isNo1Number = true;
    			Integer numero2 = null;
    			boolean isNo2Number = true;
     
    			try {
    				numero1 = Integer.valueOf(no1);
    			} catch (NumberFormatException e) {
    				isNo1Number = false;
    			}
     
    			try {
    				numero2 = Integer.valueOf(no2);
    			} catch (NumberFormatException e) {
    				isNo2Number = false;
    			}
     
    			if (isNo1Number && isNo2Number) {
    				return numero1.compareTo(numero2);
    			} else if (isNo1Number) {
    				return 1;
    			} else if (isNo2Number) {
    				return -1;
    			} else {
    				return no1.compareTo(no2);
    			}
    		}
    	}
    En appliquant à mon sorter
    (créé comme ceci : )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private TableRowSorter<DefaultTableModel> sorter;
    ...
    sorter = new TableRowSorter<DefaultTableModel>(model);
    (La boucle for pour appliquer à toutes mes colonnes)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		for (int k=0; k<numberCol; k++){
    			sorter.setComparator(k, new NumeroPositionComparator());
    		}
    Donc, ça marche super sur les int, mais pour les floats ... Absolument pas Et je suis incapable d'adapter le code aux Floats ...

    Voici une ligne exemple de mon tableau :
    1 36 180.5 21.7 184 142 217 406.3 5.6 6497 184 6497

    Je suis encore débutant en Java et j'ai quelques difficultés sur des trucs "simple" (surement des grosses lacunes dû à la vitesse à laquelle j'ai appris le langage ^^)

    Merci à tous !

    Zénome

    (EDIT : Je suis sous Java 1.6 (si ça change quelque chose ))

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Si les données sont prises en compte comme des Stirng, c'est parce que tu charges dans le modèle des String (Je suppose que c'est ce que ce que tu obtiens de ta fonction imageJ) : tu pourrais les convertir avant de les mettre dans le modèle, et utiliser un Comparator<Integer> ou Comparator<Float> (ou Comparator<Double>).

    Pour la conversion des String en int, ou Integer, tu as trouvé Integer.parseInt() (et respectivement Integer.valueOf()). Pour la conversion vers float/Float, ou double/Double, c'est similaire :

    • pour float/Float, la classe Float, a une méthode parseFloat() et une méthode valueOf()
    • pour double/Double, la classe Double à une méthode parseDouble() et valueOf()
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Salut,

    Merci de ta réponse ! J'ai réussi à tirer mes doubles en faisant ceci pour remplir mon tableau :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(int j=0; j<numberRow-1; j++){
    			for (int i=0; i<numberCol; i++){
    				row[j][i]=Double.parseDouble(sc.next());
    			}
    		}
    Et ceci à ma class

    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
    class NumeroPositionComparator implements Comparator<Double> {
     
    		@Override
    		public int compare(Double no1, Double no2) {
    			Double numero1 = null;
    			boolean isNo1Number = true;
    			Double numero2 = null;
    			boolean isNo2Number = true;
     
    			try {
    				numero1 = no1;
    			} catch (NumberFormatException e) {
    				isNo1Number = false;
    			}
     
    			try {
    				numero2 = no2;
    			} catch (NumberFormatException e) {
    				isNo2Number = false;
    			}
     
    			if (isNo1Number && isNo2Number) {
    				return numero1.compareTo(numero2);
    			} else if (isNo1Number) {
    				return 1;
    			} else if (isNo2Number) {
    				return -1;
    			} else {
    				return no1.compareTo(no2);
    			}
    		}
    Cependant, j'ai passé toutes mes colonnes en double et j'aurai aimé garder la premiere colonne en int (j'ai besoin de l'index (première colonne) en int pour d'autre fonction)... Je peux remplir le tableau avec des objet int et double mais du coup le tri ne s'effectuera plus sur la première colonne en int ... Est-ce que je peux avoir deux comparators en même temps (double et int) ?

    Merci en tout cas pour ton aide !

    EDIT : Pour la première colonne en int, j'me suis pas cassé la tête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    		for(int j=0; j<numberRow-1; j++){
    			for (int i=0; i<numberCol; i++){
    				if(i==0){
    					row[j][i]=Integer.parseInt(sc.next());
    				}
    				else{
    					row[j][i]=Double.parseDouble(sc.next());
    				}
    			}
    		}
    Et donc quand j'essaye de trier la première colonne j'me prend le message :

    Exception in thread "Run$_AWT-EventQueue-0" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Double
    at TablePanel$NumeroPositionComparator.compare(TablePanel.java:1)
    at javax.swing.DefaultRowSorter.compare(Unknown Source)
    at javax.swing.DefaultRowSorter.access$100(Unknown Source)
    at javax.swing.DefaultRowSorter$Row.compareTo(Unknown Source)
    at javax.swing.DefaultRowSorter$Row.compareTo(Unknown Source)
    at java.util.ComparableTimSort.countRunAndMakeAscending(Unknown Source)
    at java.util.ComparableTimSort.sort(Unknown Source)
    at java.util.Arrays.sort(Unknown Source)
    at javax.swing.DefaultRowSorter.sort(Unknown Source)
    at javax.swing.DefaultRowSorter.setSortKeys(Unknown Source)
    at javax.swing.DefaultRowSorter.toggleSortOrder(Unknown Source)
    at javax.swing.plaf.basic.BasicTableHeaderUI$MouseInputHandler.mouseClicked(Unknown Source)
    at java.awt.AWTEventMulticaster.mouseClicked(Unknown Source)
    at java.awt.AWTEventMulticaster.mouseClicked(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
    at java.awt.EventQueue.access$500(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.awt.EventQueue$3.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.awt.EventQueue$4.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Tu as cette exception parce que tu as fait un comparateur de double que tu as affecté à chaque colonne. Comme le type de la donnée de la colonne de Integer n'est pas du Double, tu as cette erreur.

    Soit :

    • tu mets un comparateur adapté pour chaque colonne (adapté à son type)
    • soit tu fais un comparateur capable de comparer plusieurs types différents, ou au moins types comparables (ce qui est le cas de Integer et Double)
    • soit tu utilises les comparateurs tout fait de Java 8 (qui s'adapte en types comparables)


    Illustration :

    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    public class RowSorterDemo {
     
    	public static void main(String[] args) {
     
    		JFrame frame = new JFrame("Démo");
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
    		frame.add(createTable());
     
    		frame.setSize(600, 400);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    	}
     
    	private static Component createTable() {
     
    		Object[][] rowData = {
    				{ 1, "Margarita", 6.5d, true },
    				{ 2, "Pina Colada", 10.5d, true },
    				{ 3, "Mojito", 9.5d, true },
    				{ 4, "Black Russian", 8.5d, true },
    				{ 5, "Virgin Mojito", 5.5d, false }
    		};
     
    		String[] titles = { "Id", "Nom", "Prix", "Alcoolisé" };
     
    		JPanel panel = new JPanel(new BorderLayout());
     
    		JTable table = new JTable(rowData, titles);
     
     
    		TableRowSorter<TableModel> rowSorter = new TableRowSorter<TableModel>(table.getModel());
     
    		/* // Java 7 : comparateurs dédiés
    		rowSorter.setComparator(0, new Comparator<Integer>() {
     
    			@Override
    			public int compare(Integer o1, Integer o2) {
    				return o1.compareTo(o2);
    			}
     
    		}
    		);
    		rowSorter.setComparator(1, new Comparator<String>() {
     
    			@Override
    			public int compare(String o1, String o2) {
    				return o1.compareTo(o2);
    			}
     
    		}
    		);
    		rowSorter.setComparator(2, new Comparator<Double>() {
     
    			@Override
    			public int compare(Double o1, Double o2) {
    				return o1.compareTo(o2);
    			}
     
    		}
    		);
    		rowSorter.setComparator(3, new Comparator<Boolean>() {
     
    			@Override
    			public int compare(Boolean o1, Boolean o2) {
    				return o1.compareTo(o2);
    			}
     
    		}
    		);*/
     
    		// java 7 - Comparateur de comparable
    		Comparator<Comparable<Object>> comparator = new Comparator<Comparable<Object>>() {
    			public int compare(Comparable<Object> o1, Comparable<Object> o2) {
    				return o1.compareTo(o2);
    			}
    		};
    		for(int i=0; i<table.getColumnCount(); i++) {
    			rowSorter.setComparator(i, comparator); 
    		}
     
     
    		/* // java 8 
    		for(int i=0; i<table.getColumnCount(); i++) {
    			rowSorter.setComparator(i, Comparator.naturalOrder()); 
    		}*/
     
    		table.setRowSorter(rowSorter);
     
    		panel.add(table.getTableHeader(), BorderLayout.NORTH);
    		panel.add(new JScrollPane(table));
     
    		return panel;
     
    	} 
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2015
    Messages : 10
    Points : 8
    Points
    8
    Par défaut
    Parfait ! Merci !

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

Discussions similaires

  1. Comment trier les data avec PALO Community
    Par tazoune dans le forum Autres outils décisionnels
    Réponses: 1
    Dernier message: 31/01/2012, 17h04
  2. Trier les fichiers avec FileSystemObject.
    Par tAKAmAkA dans le forum VBA Access
    Réponses: 3
    Dernier message: 22/03/2008, 15h16
  3. problème avec les doubles
    Par mahi31 dans le forum Langage
    Réponses: 1
    Dernier message: 27/04/2007, 16h37
  4. Debugger - problème avec les "double"
    Par Dev_Michael dans le forum C++Builder
    Réponses: 15
    Dernier message: 28/03/2007, 12h15
  5. Probleme avec les double Liste chainees
    Par BernardT dans le forum Langage
    Réponses: 1
    Dernier message: 12/07/2005, 18h22

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