samadio / SDM_exam

1 stars 0 forks source link

Number of players reading #11

Closed federico-camerota closed 4 years ago

federico-camerota commented 4 years ago

https://github.com/samadio/SDM_exam/blob/game_dev/src/main/java/dotsandboxes/DotsAndBoxesInput.java#L111

Questa linea fa si che il programma rimanga in attesa di nuovo input usando System.in. Commentata per far funzionare il programma e verificarne il funzionamento. Andrebbe rivista e migliorata.

samadio commented 4 years ago

Dalla documentazione 1.Java Scanner hasNext () Method:

It is a Scanner class method which returns true if this scanner has another token in its input. This method may block while waiting for input to scan.

Ora vedo se trovo soluzioni migliori, anche se non capisco da come e' scritto se questo behaviour sia un bug o per qualche motivo voluto

federico-camerota commented 4 years ago

Direi che è voluto. Il senso è quello di aspettare fino a che la sorgente ha nuovo input oppure viene segnalato che non c'è più input con un EOF o simili (Ctrl+d su terminale). Ovviamente la cosa dovrebbe valere solo per sorgenti tipo System.in in cui vi è la possibilità di nuovo input su richiesta. Nel caso di un file o di una stringa invece dovrebbe restiture false se l'input è terminato.

samadio commented 4 years ago

Soluzione proposta (non testata compilando, come idea):

Scanner s= new Scanner(System.in);

//s.tokens() returns Stream of Strings from input separated by default sep " " if(s.tokens().count()==1) return s.tokens().map(x->Integer.valueOf(x)).sum(); throw Error

federico-camerota commented 4 years ago

Direi che può andare

samadio commented 4 years ago

Dimenticavo che sum giustamente si applica su un IntStream

all the same except

return s.tokens().mapToInt(x->Integer.valueOf(x)).sum();

samadio commented 4 years ago

visto che s.tokens() per qualche motivo consuma lo scanner originario, ho cambiato approccio: prima costuisco la List input=s.tokens().collect(Collectors::toList). Poi controllo size e lavoro con input. Vedi codice. Aspetto conferma per chiudere l'issue

federico-camerota commented 4 years ago

Visto che tokens consuma lo scanner suggerirei di arrivare alla lista usando Arrays.toList(s.nextLine().split()). Non è funzionale ma elimina il problema. Credo comunque lo scanner in questo caso continui a funzionare anche dopo aver chiamato tokens perchè legato a System.in

Inoltre quando si cattura l'eccezione input (la lista) dev'essere aggiornata nuovamente leggendo dalla sorgente di input.

samadio commented 4 years ago

dovrei aver risolto tutto. ho provato anche il behaviour delle eccezioni e gia' che c'ero ho fatto si che gli elementi vuoti in una lista non ci diano problemi(quindi un input=" 4" oppure "4 " vengano ragionevolmente considerati validi). Confermami che chiudo

federico-camerota commented 4 years ago

L'idea andava bene, ho apportato un paio di semplici modifiche: