Obtenir les nombres les plus grands dans un fichier
alwaysin
Messages postés2Date d'inscriptiondimanche 7 novembre 2010StatutMembreDernière intervention22 janvier 2011
-
22 janv. 2011 à 22:36
cs_Robert33
Messages postés834Date d'inscriptionsamedi 15 novembre 2008StatutMembreDernière intervention14 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.
A voir également:
Obtenir les nombres les plus grands dans un fichier
alwaysin
Messages postés2Date d'inscriptiondimanche 7 novembre 2010StatutMembreDernière intervention22 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,...
cs_Robert33
Messages postés834Date d'inscriptionsamedi 15 novembre 2008StatutMembreDernière intervention14 janvier 201733 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();
}
}