ArrayList : tri avec Interface Comparator ne compile pas ?

sergio1236 Messages postés 11 Statut Membre -  
KX Messages postés 19031 Statut Modérateur -
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());
}

}

5 réponses

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    "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
  2. sergio1236 Messages postés 11 Statut Membre
     
    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
  3. KX Messages postés 19031 Statut Modérateur 3 020
     
    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
  4. sergio1236 Messages postés 11 Statut Membre
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. KX Messages postés 19031 Statut Modérateur 3 020
     
    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