Ho un esercizio di questo tipo:
Ora io ho realizzato tutto quanto, solo che credo ci sia un problema, quando leggo il file di input, certi oggetti vengono clonati...non capisco il perchè.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
L'idea è stata di leggere una prima volta il file per sapere quanti giocatori ci sono, e poi in una seconda lettura leggere l'input, costruire l'oggetto ed inserirlo in un array di oggetti.
Ma mi sembra che vengano clonati perchè facendo una prova e stampandoli con il toString in output mi stampa per più oggetti lo stesso nome, o valori che non dovrebbero esserci.
Vi posto entrambi i file, in uno vi è la costruzione degli oggetti tramite Building, nell'altra il programma vero e proprio. Temo che l'errore sia nella fase di lettura e costruzione nella classe Intestaallaclassifica.
E poi: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"); 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(); 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(); 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)!=' ') controllo++; controllo++; while(oggetto.charAt(controllo)!=')') { valore+=oggetto.charAt(controllo); controllo++; } if(Integer.parseInt(valore)>max) { max=Integer.parseInt(valore); index=j; } } } elementi++; classifica[position++]=giocatori[index]; elementi++; if(index==0) { 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"); } } }

Rispondi quotando