Ho questo esercizio:

codice:
Si scriva un programma Java che prenda in input un file contenente una sequenza
di righe, ognuna contenente le informazioni relative ad un punteggio di giuoco, e
costruisca la classifica dei primi cento punteggi ottenuti.
Ogni riga del file contiene una sequenza di opzioni seguiti dai relativi valori.
Le varie opzioni devo essere interpretate nel modo seguente:
-nick: seguito da una stringa con il nickname del giocatore (č sempre presente).
-p: seguito da un intero che indica il punteggio complessivo (č sempre presente).
-a: seguito da un intero, indica l'etą del giocatore.
-i: seguito da una data, indica la data d'iscrizione del giocatore.
-n: seguito da un intero, indica il numero di partite giocate dal giocatore.
-u: seguito da un intero, indica l'ultimo punteggio ottenuto dal giocatore.
-dp: seguito da una data, indica la data in cui č stato totalizzato il punteggio.
-bonus: non seguito da alcun valore, indica che il giocatore ha un bonus.
Tutte le righe finiscono con un punto e virgola preceduto da uno spazio.
In caso di parimerito deve apparire per primo il giocatore che appare per prima nella
lista di input.
Specifiche
Utilizzare un oggetto Builder per la costruzione degli oggetti contenuti nella
classifica di giuoco. Gli oggetti contenuti nella classifica devono essere definiti come
oggetti immutabili
Utilizzare i metodi toString() per la descrizione degli oggetti.
Input
Il file di input contiene una sequenza di righe, ognuna contenente le informazioni
relative ad un punteggio di giuoco.


Il file di output contiene la classifica dei primi cento giocatori che hanno ottenuto il
punteggio pił alto.
Ogni riga del file contiene l'informazione su ogni posizione della classifica.
Il primo elemento di ogni riga č la posizione della classifica racchiuso traparentesi
quadre e seguito da uno spazio.
Seguono il nickname del giocatore ed il punteggio ottenuto, separati da una virgola
e racchiusi tra parentesi tonda.
I successivi valori sono tutti separati da una virgola e possono non essere presenti.
In particolare l'ordine e la descrizione dei valori deve seguire l'esempio mostrato di
seguito.
[***] (***, ***), nome : ***, *** anni, punteggio ottenuto il ****, *** partite
giocate, iscritto dal ***, ultimo punteggio ottenuto : ***, bonus utilizzato
Ora il codice č fatto, perņ ho un problema, nell'output qualcosa non funziona...certi oggetti vengono dublicati, e non corrispondono i nick...per esempio:

codice:
[1] (GDEANGELIS, 9994), nome : Matteo MANTOVANI, 29 anni, punteggio ottenuto il 28/7/2010, 5548 partite giocate, iscritto dal 2/4/2009, ultimo punteggio ottenuto : 2778, bonus utilizzato
[2] (GPAGANO, 9989), nome : Giacomo PAGANO, 24 anni, punteggio ottenuto il 20/11/2010, 366 partite giocate, iscritto dal 26/4/2009, ultimo punteggio ottenuto : 168, bonus utilizzato
[3] (DSERRA, 9978), nome : Dario SERRA, 32 anni, punteggio ottenuto il 6/10/2010, 6914 partite giocate, iscritto dal 2/8/2009, ultimo punteggio ottenuto : 1610, bonus utilizzato
[4] (LSANTORO, 9972), nome : Giada VITALE, 38 anni, punteggio ottenuto il 23/10/2010, 8183 partite giocate, iscritto dal 16/10/2009, ultimo punteggio ottenuto : 9281, bonus utilizzato
[5] (PMARTINELLI, 9971), nome : Silvia MONTI, 29 anni, punteggio ottenuto il 6/2/2010, 4899 partite giocate, iscritto dal 15/1/2009, ultimo punteggio ottenuto : 1624, bonus utilizzato
[6] (GFIORE, 9971), nome : Debora GRECO, 37 anni, punteggio ottenuto il 26/12/2010, 2032 partite giocate, iscritto dal 23/6/2009, ultimo punteggio ottenuto : 435, bonus utilizzato
Per alcuni come vedete non c'č corrispondenza di nick e parametri, ma non ho capito da cosa dipenda...posto l'intero codice commentato, se mi poteste aiutare ve ne sarei grato.


Classe con il Building

codice:
public class Giocatori
{
	private final String nome;
	private final String nick;
	private final int p;
	private final int a;
	private final String i;
	private final int n;
	private final int u;
	private final String dp;
	private final boolean bonus;
	
	
	
	
	public static class Builder
	{
		private final String nick;
		private final int p;
		
		public Builder(String nick, int p)
		{
			this.nick=nick;
			this.p=p;
		}
		
		private String nome="";
		private int a=-1;
		private String i="";
		private int n=-1;
		private int u=-1;
		private String dp="";
		private boolean bonus=false;
		
		
		public Builder nome(String nome)
		{
			this.nome=nome;
			return this;
		}
		
		public Builder a(int a) 
		{
			this.a=a;
			return this;
		}
		
		public Builder i(String i)
		{
			this.i=i;
			return this;
		}
		
		public Builder n(int n)
		{
			this.n=n;
			return this;
		}
		
		public Builder u(int u)
		{
			this.u=u;
			return this;
		}
		
		public Builder dp(String dp)
		{
			this.dp=dp;
			return this;
		}
		
		public Builder bonus(String bonus)
		{
			if(bonus.equals("-bonus"))
			this.bonus=true;
			return this;
		}
		
		public Giocatori build()
		{
			return new Giocatori(this);
		}
	}
	
	
	private Giocatori(Builder builder)           //perchč non public?
	{
		nick=builder.nick;
		p=builder.p;
		a=builder.a;
		i=builder.i;
		n=builder.n;
		u=builder.u;
		dp=builder.dp;
		bonus=builder.bonus;
		nome=builder.nome;
	}
	
	public String toString()
	{
		String ret="("+nick+", "+p+")";
		
		if(nome.compareTo("")!=0) ret+=", nome : "+nome;
		if(a!=-1) ret+=", "+a+" anni";
		if(dp.compareTo("")!=0) ret+=", punteggio ottenuto il "+dp;
		if(n!=-1) ret+=", "+n+" partite giocate";
		if(i.compareTo("")!=0) ret+=", iscritto dal "+i;
		if(u!=-1) ret+=", ultimo punteggio ottenuto : "+u;
		if(bonus) ret+=", bonus utilizzato";
		
		return ret;
		
	}
}
codice:
import java.io.*;
import java.util.StringTokenizer;


public class Intestaallaclassifica
{
	public static void main(String [] args) throws IOException
	{
		FileReader reader=null;
		FileWriter out=null;
		BufferedReader buff=null;
		StringTokenizer info=null;
		
			String nome="";
			String nick="";
			int p=-1;
			int a=-1;
			String i="";
			int n=-1;
			int u=-1;
			String dp="";
			boolean bonus=false;
			String contrlbonus="";
			
		
		try
		{
			
			long start=System.currentTimeMillis();
		
			out=new FileWriter("output.txt");
			reader=new FileReader("input.txt");
			buff=new BufferedReader(reader);
			

			int count=0;
			int concorrenti=0;
			
			while(buff.readLine()!=null)
				concorrenti++;
			
			reader=new FileReader("input.txt");          //reinzializzo per la seconda lettura
			buff=new BufferedReader(reader);
			
			Giocatori [] giocatori=new Giocatori[concorrenti];
			
			String parametri="";
			
			while(buff.ready())
			{
					
				info=new StringTokenizer(buff.readLine(), " ;");
				
				
				while(info.hasMoreTokens())
				{
					parametri=info.nextToken();           //controllo la presenza dei vari parametri
					
					if(parametri.equals("-nick"))
					nick=info.nextToken();
					
					else if(parametri.equals("-p"))
					p=(Integer.parseInt(info.nextToken()));
					
					else if(parametri.equals("-a"))
					a=(Integer.parseInt(info.nextToken()));
					
					else if(parametri.equals("-i"))
					i=info.nextToken();
					
					else if(parametri.equals("-n"))
					n=(Integer.parseInt(info.nextToken()));
					
					else if(parametri.equals("-u"))
					u=(Integer.parseInt(info.nextToken()));
					
					else if(parametri.equals("-dp"))
					dp=info.nextToken();
					
					else if(parametri.equals("-bonus"))
					contrlbonus="-bonus";
					
					else if(parametri.equals("-nome"))
						nome=info.nextToken()+" "+info.nextToken();
					
					parametri="";
				}
				
				Giocatori giocatore=new Giocatori.Builder(nick, p).nome(nome).a(a).i(i).n(n).u(u).dp(dp).bonus(contrlbonus).build();
				//l'oggetto sarą costruito "PER ESEMPIO" cosģ: (GDEANGELIS, 9994), punteggio ottenuto il 28/7/2010
				giocatori[count++]=giocatore;
			}
				
			Giocatori [] classifica =new Giocatori[100];
			
			int max;
			int index;
			int position=0;
			int elementi=0;
			int controllo=0;
			String valore="";
			String oggetto;
		
			while(elementi<100)
			{		
				index=0;
				max=0;	
				
				for(int j=0; j<giocatori.length; j++)
				{
					
					
					valore="";
					controllo=0;
						
					if(giocatori[j]!=null){
					oggetto=giocatori[j].toString();
					
						
					while(oggetto.charAt(controllo)!=' ') //(GDEANGELIS, 9994)// arrivo allo spazio dopo la virgola 
						controllo++;
						controllo++;
					
					    while(oggetto.charAt(controllo)!=')')              //finchč non arrivņ alla parentesi di 9994)
					    {
						valore+=oggetto.charAt(controllo);     //memorizzo il punteggio
						    controllo++;
					    }						    
						
						if(Integer.parseInt(valore)>max)
						{
					         	max=Integer.parseInt(valore);          //cerco il massimo
						         index=j;                                       //mi serve per la posizioe
						} 
					}
				}
				
					elementi++;
				
					classifica[position++]=giocatori[index];       //inserisco nell'array ordinatamente nelle posizioni i giocatori
					elementi++;
					
					if(index==0)                                                 //in questa sezione dovrei eliminare l'elemento (giocatore) che gią ho inserito
					{
						for(int j=1; j<giocatori.length; j++)
						giocatori[j-1]=giocatori[j];
						
						giocatori[giocatori.length-1]=null;
					}
			
					else if(index==giocatori.length-1)                          
					giocatori[index]=null;
			
					else 
					{
						for(int j=index; j<giocatori.length-2; j++)
						giocatori[j]=giocatori[j+1];
				
						giocatori[giocatori.length-1]=null;
					}
				
			}
			
			position=1;
				
			for(int j=0; j<100; j++)
			{
				out.write("["+position+"] "+classifica[j].toString()+'\r'+'\n');
				position++;
			}
			
			long end=System.currentTimeMillis();
			System.out.println("TEMPO TRASCORSO "+(end-start));
			
			for(int k=0; k<giocatori.length; k++)
			System.out.println(giocatori[k].toString());
			
		}
		
		catch(IOException e)
		{
			System.out.println("ERROR");
		}
	}
}