Obtenir les nombres les plus grands dans un fichier

alwaysin Messages postés 2 Date d'inscription dimanche 7 novembre 2010 Statut Membre Dernière intervention 22 janvier 2011 - 22 janv. 2011 à 22:36
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 - 23 janv. 2011 à 10:00
Bonjour,

je dispose d'un fichier dont la structure est la suivante :
nom1,nombre1
nom2,nombre2
nom3,nombre3

Je cherche à extraire les 5 lignes avec les "nombreN" étant les plus grands (comme faire un tri de toutes les valeurs en ordre décroissant, puis de prendre les 5 premières, en fait), peu importe cette valeur. Je dois aussi faire attention au fait qu'il peu y avoir moins de 5 lignes.

Je dispose du code suivant pour stocker les valeurs dans une structure :
            struct scores
            {
                public string prenom;
                public Int16 score;
            }     
            private void Form1_Load(object sender, EventArgs e)
            {
            scores[] tabScores;
            tabScores = new scores[5];
            FileStream fs = new FileStream(@"C:\fichier.txt", FileMode.Open);
            StreamReader sr = new StreamReader(fs);
            string s = sr.ReadLine();
            int i = 0;
            while (s != null)
            {
                string[] points = s.Split(',');
                //Ici il me faudrait vérifier les nombres avant de les insérer
                tabScores[i].prenom = points[0];
                tabScores[i].score = Convert.ToInt16(points[1]);
                s = sr.ReadLine();
                i = i + 1;
            }
            }

Mon problème est que là, les 5 premières lignes vont être insérées dans le tableau de structure.
Or, je veux que ce soit les lignes qui ont les chiffres les plus élevés qui le soient.
Je ne sais malheureusement pas comment procéder.
J'espère que vous aurez de quoi m'aider ^^
Merci d'avance.

2 réponses

alwaysin Messages postés 2 Date d'inscription dimanche 7 novembre 2010 Statut Membre Dernière intervention 22 janvier 2011
22 janv. 2011 à 22:58
Bonsoir,

c'est encore moi.
Si cela est trop compliqué, l'on pourrait utiliser une autre méthode.
Il serait peut-être mieux de trier directement les valeurs quand elles sont écrites dans le fichier.
En effet, à la base, quand l'application est lancée, le fichier n'existe pas et je le crée donc en créant une ligne nom1,nombre1.
Lors de la deuxième fois où j'écris, il serait peut-être bon de mettre nom2,nombre2 avant nom1,nombre1 si nombre2 est plus grand, ou sinon après. Ainsi de suite pour nombre3, nombre4,...
0
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
23 janv. 2011 à 10:00
Bonjour

En effet ta seconde solution sera plus performante sinon
l'idée est, pour chaque score du fichier, de chercher s'il n'est pas plus grand que le plus petit des 5 dèjà connus
dans ce cas on remplace.

scores[] tabScores;
tabScores = new scores[5];
using (StreamReader sr = new StreamReader(@"C:\fichier.txt"))
{
    string s = sr.ReadLine();
    while (s != null)
    {
        string[] points = s.Split(',');
        Int16 score = Convert.ToInt16(points[1]);

        int minScore = int.MaxValue;
        int indexMinScore = 0;
        for (int j = 0; j < 5; j++)
        {
            //cherche le plus petit des 5 scores 
            if (tabScores[j].prenom == null || minScore > tabScores[j].score)
            {
                minScore = tabScores[j].score;
                indexMinScore = j;
            }
        }
        //score plus grand que le plus petit ? on remplace
        if (score > minScore)
        {
            tabScores[indexMinScore].prenom = points[0];
            tabScores[indexMinScore].score = score;
        }
        s = sr.ReadLine();
    }
}


Bob.

C# is amazing, enjoy it!
0
Rejoignez-nous