ArrayList : tri avec Interface Comparator ne compile pas ?

Fermé
sergio1236 Messages postés 9 Date d'inscription vendredi 22 mars 2013 Statut Membre Dernière intervention 13 juin 2013 - 22 mars 2013 à 18:28
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 22 mars 2013 à 22:35
Bonjour,

enoncé ex : tahe.developpez.com/java/exercices/
Gestion d'une élection proportionnelle.
Le code est bon,mais j'ai un problème avec le tri ordre descendant de l'Arraylist en tableau : à la compilation,
j'ai un message d'erreur :
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
at istia.st.elections.MainElections$CompareListesElectorales.main(MainElections.java:75)


// conversion de l'ArrayList en tableau
ListeElectorale [] tab = liste1.toArray(new ListeElectorale[liste1.size()]);
Arrays.sort(tab, new CompareListesElectorales());
}

Merci d'avance pour votre aide.


-----------------------------------------------------------------------------------------

package istia.st.elections;
import istia.st.elections.ListeElectorale;

import java.util.*;

public class MainElections {

final static int TOTAL=100000;
final static double MIN = TOTAL*0.05;
final static int MAXSIEGE = 6 ;
ArrayList<ListeElectorale> liste=new ArrayList<ListeElectorale>();
static Scanner ls;
static Scanner vo;
static int voix;
static String nl;

// classe de comparaison de listes électorales

static class CompareListesElectorales implements Comparator<ListeElectorale> {

// tri décroissant de deux listes électorales selon le nombre de sièges
private static int j;
private ArrayList<ListeElectorale> liste1;

public int compare(ListeElectorale obj1, ListeElectorale obj2) {

// on récupère les listes électorales
ListeElectorale listeElectorale1 = obj1;
ListeElectorale listeElectorale2 = obj2;
// on compare les sièges de ces deux listes

int v1 = ( obj1).getVoix();
int v2 = ( obj2).getVoix();

if(v1 == v2)
return 0;

if(v1 > v2)
return -1;
return 1;
}



public static void main(String[] args) {

ArrayList<ListeElectorale> liste1 = new ArrayList<ListeElectorale>();
ArrayList<ListeElectorale> liste2 = new ArrayList<ListeElectorale>();
int nbSieges=0;
double rest=0;
int i=0;
int j=0;

System.out.println("Entrez les nombres des sieges");
Scanner sc = new Scanner(System.in);
int sieges = sc.nextInt();

// création des listes électorales
System.out.println("Entrez le nom de la liste");
String nl = sc.next();
System.out.println(nl);

while(!nl.equals("*"))
{

for (ListeElectorale str: liste1)
{
double som=0;
double moy=0;
Iterator<ListeElectorale> itr = liste1.iterator();
if (itr.next().getVoix()>MainElections.MIN){
liste1.add(str);
som +=str.getVoix();
System.out.println(str);
}
moy=som/liste1.size();
rest = (itr.next().getVoix()%moy);
sieges=(int) (itr.next().getVoix()/moy);


for(i=0;i<liste1.size();i++)
{
if(sieges>0){
nbSieges=sieges;
}
}
for( i=0;i<nbSieges;i++) {

System.out.println("Liste " + itr.next().getNom() + " " + nbSieges+ " : sièges");
}
}

int ind=0;
ListeElectorale tmp;
for(i=0;i<2;i++)
{

Iterator<ListeElectorale> itr = liste2.iterator();
int max=0;
for(ListeElectorale str2 : liste2)
{

if(max<rest)
{
max=(int) rest;
ind=j;
liste2.add(str2);
}
}

nbSieges=nbSieges+1;
rest=0;
tmp = (ListeElectorale) liste2.get(j);
tmp.toString();
}
}
}

// conversion de l'ArrayList en tableau
ListeElectorale [] tab = liste1.toArray(new ListeElectorale[liste1.size()]);
Arrays.sort(tab, new CompareListesElectorales());
}



}
A voir également:

5 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
22 mars 2013 à 18:56
"Le code est bon, mais j'ai un problème (...) à la compilation"
Donc le code n'est pas bon ^^

Quel est le message d'erreur de la compilation ?

Remarque : copier la collection dans un tableau et trier le tableau est plus couteux que trier directement la collection :

Collections.sort(liste1, new Comparator<ListeElectorale>()
{
    @Override
    public int compare(ListeElectorale e1, ListeElectorale e2)
    {
        return Integer.compare(e2.getVoix(), e1.getVoix());
    }
});
0
sergio1236 Messages postés 9 Date d'inscription vendredi 22 mars 2013 Statut Membre Dernière intervention 13 juin 2013
22 mars 2013 à 19:17
en effet, le code Arrays.sort (tab, new CompareListesElectorales() ); , n'est pas bon.

En fait, l'énoncé demande de transférer l'ArrayList dans un tableau de liste : " parce qu'on ne connaît pas à priori le nombre de listes, celles-ci seront tout d'abord mémorisées dans un objet de type[ArrayList]. Puis, lorsque toutes les listes auront été saisies, elles seront transférées dans un tableau de listes. "
-les résultats seront affichés par ordre décroissant du nombre de sièges obtenus. "


Dans Eclipse : j'ai plusieurs messages sur la ligne de l'erreur :
Multiple markers at this line :
Syntax error on token ",", = expected
Syntax error on token "(" , delete this token )
Syntax error on token ")" , delete this token )

Dans Eclipse, à la compilation , quand je clique sur " Run as Java application " ,
dans la Console , j'obtiens le message suivant :
j'ai un message d'erreur :
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
atistia.st.elections.MainElections$CompareListesElectorales.main(MainElections.java:75)

ligne 75 public static void main(String[] args) {.....
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
22 mars 2013 à 19:30
Tu ne peux pas faire "Run as" si tu as encore des erreurs, Java te renverra (comme ici) une erreur sur le main parce que le programme n'est pas compilé. Mais ce n'est pas cette erreur d'exécution qu'il faut regarder mais les erreurs de compilation !

Tes 3 erreurs de "Syntax error on token" à quel code ça correspond ?
0
sergio1236 Messages postés 9 Date d'inscription vendredi 22 mars 2013 Statut Membre Dernière intervention 13 juin 2013
22 mars 2013 à 20:03
Toutes les 3 erreurs de Syntax correspondent à la ligne 154 :
Arrays.sort(tab,new CompareListesElectorales());

et on les retrouve dans l'onglet " Problems" view ( erreurs de compilation):
j'ai de nouveau les mêmes problèmes signalés :
Description Resource Path Location Type
line 154 : Arrays.sort(tab,new CompareListesElectorales());

1° ) Syntax error on token ",", = expected MainElections.java /prElectionsGroupe02/src/istia/st/elections line 154 Java Problem

2°) Description Resource Path Location Type
Syntax error on token ")", delete this token MainElections.java /prElectionsGroupe02/src/istia/st/elections line 154 Java Problem

3°) Description Resource Path Location Type
Syntax error on token ")", delete this token MainElections.java /prElectionsGroupe02/src/istia/st/elections line 154 Java Problem

Warnings :
Description Resource Path Location Type
Build path specifies execution environment JavaSE-1.6. There are no JREs installed in the workspace that are strictly compatible with this environment. prElectionsGroupe02 Build path JRE System Library Problem
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
22 mars 2013 à 22:35
Je viens de tester ton code, et l'erreur est simple, c'est que tu mets ta ligne de code en dehors de la méthode main, elle se retrouve donc dans un bloc d'instructions qui n'autorise pas à avoir des appels de méthodes comme ça...

C'est le genre de choses que tu aurais pu voir facilement en faisant des indentations dans ton code !

Remarque : ta classe CompareListesElectorales est beaucoup trop compliqué pour pas grand chose, de plus il n'y a pas de raison de la mettre comme ça en classe interne de MainElections, il serait plus logique de faire une classe à part, voire d'implémenter Comparable dans ta classe ListeElectorale ce qui évite l'utilisation d'un Comparator pour faire le sort...

package istia.st.elections;
import istia.st.elections.ListeElectorale;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.ListIterator;
import java.util.Scanner;

// classe de comparaison de listes électorales 

class CompareListesElectorales implements Comparator<ListeElectorale> 
{
    public int compare(ListeElectorale liste1, ListeElectorale liste2)
    {
        return Integer.compare(liste2.getVoix(), liste1.getVoix());
    }
}

public class MainElections 
{ 
    final static int TOTAL=100000;
    final static double MIN = TOTAL*0.05;
    final static int MAXSIEGE = 6 ;
    ArrayList<ListeElectorale> liste=new ArrayList<ListeElectorale>();
    static Scanner ls;
    static Scanner vo;
    static int voix;
    static String nl;
    
    public static void main(String[] args)
    { 
        ArrayList<ListeElectorale> liste1 = new ArrayList<ListeElectorale>(); 
        ArrayList<ListeElectorale> liste2 = new ArrayList<ListeElectorale>();
        
        int nbSieges=0; 
        double rest=0; 
        int i=0; 
        int j=0; 
        
        System.out.println("Entrez les nombres des sieges"); 
        Scanner sc = new Scanner(System.in); 
        int sieges = sc.nextInt(); 
        
        // création des listes électorales 
        System.out.println("Entrez le nom de la liste");    
        String nl = sc.next();    
        System.out.println(nl); 
        
        while(!nl.equals("*")) 
        {
            for (ListeElectorale str: liste1) 
            { 
                double som=0; 
                double moy=0; 
                
                ListIterator<ListeElectorale> itr = liste1.listIterator(); 
                
                if (itr.next().getVoix()>MainElections.MIN)
                { 
                    liste1.add(str); 
                    som +=str.getVoix(); 
                    System.out.println(str); 
                } 
                
                moy=som/liste1.size();
                rest = (itr.next().getVoix()%moy);
                sieges=(int) (itr.next().getVoix()/moy);
                
                for(i=0;i<liste1.size();i++)
                {
                    if(sieges>0)
                    {
                        nbSieges=sieges;
                    }
                }
                
                for(i=0;i<nbSieges;i++)
                {
                    System.out.println("Liste " + itr.next().getNom() + " " + nbSieges+ " : sièges");
                }
            }
            
            int ind=0;
            ListeElectorale tmp;
            
            for(i=0;i<2;i++)
            {
                ListIterator<ListeElectorale> itr = liste2.listIterator();
                int max=0;
                
                for(ListeElectorale str2 : liste2)
                {
                    if(max<rest)
                    {
                        max=(int) rest;
                        ind=j;
                        liste2.add(str2);
                    }
                }
                
                nbSieges=nbSieges+1;
                rest=0;
                tmp = (ListeElectorale) liste2.get(j);
                tmp.toString();
            }
            
            // conversion de l'ArrayList en tableau
            ListeElectorale [] tab = liste1.toArray(new ListeElectorale[liste1.size()]);
            Arrays.sort(tab, new CompareListesElectorales());
        }
    }
}
0