Bonjour à tous.
Je bloque actuellement sur un petit problème de conception sur une problématique d'affectation de valeurs.
Voila ce que je dois faire:
Dans un amphi, je dois placer les élèves de plusieurs classes en leur attribuant un numéro de table.
Les élèves d'une même classe ne doivent jamais être côte à côte.
Le nombre d'élève par classe est très aléatoire. Certaines formations comptent jusqu'à 50 élèves alors que d'autres n'en comptent qu'une dizaine.
Ne connaissant pas le nombre de place dans chaque amphi, on va partir du principe que la personne qui utilisera l'appli vérifiera que le nombre total d'élève est inférieur au nombre de place dans l'amphi. Mais on verra aussi que cela m’empêche certains contrôles.
Le classement se ferait amphi par amphi, donc le traitement concernerait au max 150 élèves à chaque fois.
En entrée:
La liste des élèves au départ est un fichier excel. Je pensais donc passer par un extract en csv dans un 1er temps.
Ma méthode principale prendrait donc en entrée mon fichier csv.
Les colonnes du fichier serait du type:
NOM;PRENOM;CLASSE
En sortie:
Après traitement, je voudrais une sortie CSV du type:
PLACE;NOM;PRENOM;CLASSE
TODO:
Pour l'instant, au niveau de la lecture du CSV, j'ai fait un tableau de String[] à partir de chaque ligne du fichier (ce qui correspond aux info sur chaque élève).
Je pensais partir sur une HashMap ayant pour clé le nom de la classe et en valeur un autre tableau de String[] des élèves correspondants.
HashMap<NOM CLASSE, ArrayList<String[]>>
C'est là que ça se complique. Le positionnement des élèves me pose problème.
Je pensais pour chaque "clé" de la Map, vérifier le nombre d'élèves associés (taille de chaque tableau).
Puis placer les élèves dans une Map triée (TreeMap ??) avec en clé le numéro de table dans l'amphi et en valeur le String[] correspondant aux infos de l'élève concerné. Le positionnement se faisant, modulo le nombre de classe (ou de clés) en commençant par la classe contenant le moins d'élèves.
Exemple/Problématique:
Sur 3 classes A (7 élèves), B (3 élèves) et C (9 élèves).
Avec x, une position non attribuée.
1ère boucle sur la classe B Modulo 3 classes:
B,x,x,B,x,x,B
2ème boucle sur la classe A Modulo 3 classes en commençant à la position +1.
B,A,x,B,A,x,B,A,x,x,A,x,x,A,x,x,A,x,x,A
3ème boucle sur la classe C, Modulo 3 en commençant à la position +2.
B,A,C,B,A,C,B,A,C,x,A,C,x,A,C,x,A,C,x,A,C,x,x,C,x,x,C
==> On voit bien mon problème ici. Des places restent vides. Ce qui signifie avec cette méthode que le nombre de place que j'attribue peut devenir supérieur au nombre de places dans l'amphi.
==> Il faudrait alors refaire un nouveau passage pour décaler chaque élève.
==> Sachant qu'il faut être sûr que les élèves d'une même classe ne soient pas à côté (au pire ils doivent être séparés d'une table) => on a été élèves, on sait bien que certains sont tentés de regarder sur la feuille du voisin
Je n'ai pas non plus (pour l'instant) d'impératif d'ordonnancement alphabétique par classe.
Une fois ma Map finalisée, il faudrait réécrire dans mon fichier csv de sortie tel que défini plus haut.
Je ne sais pas si mes explications sont très claires.
J'ai essayé d'illustrer par un exemple pour vous faire comprendre la problématique.
Je voudrais donc des conseils, à savoir si vous connaissez une méthode plus simple, et surtout valide, qui me permettrait de positionner mes élèves?
Peut être que ce que je souhaite faire existe déjà, et je n'ai peut être pas besoin de réinventer la roue... mais je n'ai rien trouvé pour l'instant.
Merci d'avance pour vos réponses.
Bonne journée à tous.
Cordialement.
Partager