Entra

View Full Version : [JAVA]trovare la parola più lunga..aiuto!


blue_blue
03-11-2007, 15:23
Ciao!
Ho iniziato un mesetto fa all'uni a studiare questo linguaggio, ma a dire il vero mi sto abbastanza incasinando :stordita:
la prof ci ha dato questo esercizio: dato un testo in ingresso, individuare qual è la parola più lunga.
Ecco, non riesco a venircene fuori..ho pensato di fare così:
-ricevo il testo in ingresso
-mi creo un array di tipo String, prendo ogni parola del testo e la inserisco singolarmente nell'array
-per confrontarle..boh, a noi ha introdotto i metodi compareTo e equals..io avevo pensato di usare il compareTo in questo modo: se la parola in a[i] viene prima di quella in a[i+1], allora sostituisci a[i] con a[i+1] e così via in un ciclo for..
Secondo voi è un'idea stupida?
Più in generale, avete qualche consiglio da darmi per risolvere questi problemini? fino al mese scorso non sapevo neanche cosa fosse la programmazione, e adesso mi trovo un po' in difficoltà..sto continuando a provare a fare esercizi di questo genere, ma non me ne riesce neanche uno :(
Ringrazio chi avrà voglia di aiutarmi..

carter100
03-11-2007, 15:42
Edit...

lattone
03-11-2007, 15:43
Ciao, quando programmi in java tieni sempre a portata di mano la documentazione.
Qui trovi tutto quello che ti serve per risolvere il problema.
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html

leggi come funziona il compareTo e capirai perchè la tua soluzione non è conveniente.

blue_blue
03-11-2007, 15:58
Ciao, quando programmi in java tieni sempre a portata di mano la documentazione.
Qui trovi tutto quello che ti serve per risolvere il problema.
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html

leggi come funziona il compareTo e capirai perchè la tua soluzione non è conveniente.

il compareTo dovrebbe confrontare due stringhe in base all'ordine alfabetico..è per questo che non va bene? però non saprei in che altro modo confrontare le due parole..

EDIT: forse dovrei usare il metodo length()?

isAlreadyInUse
03-11-2007, 16:02
lenght() ti restituisce la lunghezza della stringa, e quello che ti serve

andbin
03-11-2007, 16:02
dato un testo in ingresso, individuare qual è la parola più lunga.
Ecco, non riesco a venircene fuori..ho pensato di fare così:
-ricevo il testo in ingresso
-mi creo un array di tipo String, prendo ogni parola del testo e la inserisco singolarmente nell'array
-per confrontarle..boh, a noi ha introdotto i metodi compareTo e equals..io avevo pensato di usare il compareTo in questo modo: se la parola in a[i] viene prima di quella in a[i+1], allora sostituisci a[i] con a[i+1] e così via in un ciclo for..
Secondo voi è un'idea stupida?Innanzitutto parli di lunghezza delle parole, quindi il contenuto non credo che sia rilevante (cioè equals o compareTo non ti servono) ... ti basta usare length() per sapere la lunghezza.

Inoltre, se tenere un array o meno, dipende da cosa usi per ottenere le singole parole. Se hai una unica stringa in input, devi chiaramente "spezzarla" per ottenere le singole parole. Come fare questo ... dipende da cosa vuoi usare: StringTokenizer? Scanner? o una espressione regolare ad esempio usando split()?

Prova ad esempio:
StringTokenizer st = new StringTokenizer (" ciao prova delle parole ");
while (st.hasMoreTokens ())
System.out.println (st.nextToken ());

71104
03-11-2007, 16:05
-per confrontarle..boh, a noi ha introdotto i metodi compareTo e equals..io avevo pensato di usare il compareTo in questo modo: se la parola in a[i] viene prima di quella in a[i+1], allora sostituisci a[i] con a[i+1] e così via in un ciclo for.. da notare che questo algoritmo funziona solo se il for va a rovescio, cioè dall'indice massimo fino a 0

Secondo voi è un'idea stupida? non capisco perché scambiare gli elementi dell'array per far arrivare in una certa posizione quello di interesse; prenditi semplicemente tutte le lunghezze di tutti gli elementi, memorizza man mano l'indice di quella massima che hai trovato, e alla fine ritorna l'elemento che sta a quell'indice.

una cosa del genere direi:

String longest(String inputText)
{
String[] splittedText = inputText.split(" ");

String result = null;
int maximumLength = 0;

for (String word : splittedText)
{
if (word.length() > maximumLength)
{
maximumLength = word.length();
result = word;
}
}

return result;
}




sto continuando a provare a fare esercizi di questo genere, ma non me ne riesce neanche uno :( continua perseverante e vedrai che ti riusciranno ;)

feyd
03-11-2007, 16:25
tieni in una variabile la parola piu lunga trovata fino ad ora.
tokenizzi come suggerito e per ogni token ne confronti la lunghezza con la lunghezza della parola correntemente salvata. se è maggiore quella è la parola temporaneamente piu lunga.
quando hai finito il testo in ingresso nella variabile c'è la parola piu lunga.

come gli altri ti suggerisco la documentazione java.

feyd

blue_blue
03-11-2007, 16:44
Innanzitutto parli di lunghezza delle parole, quindi il contenuto non credo che sia rilevante (cioè equals o compareTo non ti servono) ... ti basta usare length() per sapere la lunghezza.

Inoltre, se tenere un array o meno, dipende da cosa usi per ottenere le singole parole. Se hai una unica stringa in input, devi chiaramente "spezzarla" per ottenere le singole parole. Come fare questo ... dipende da cosa vuoi usare: StringTokenizer? Scanner? o una espressione regolare ad esempio usando split()?

Prova ad esempio:
StringTokenizer st = new StringTokenizer (" ciao prova delle parole ");
while (st.hasMoreTokens ())
System.out.println (st.nextToken ());
per ottenere le singole parole, avevo scritto così :
Scanner in = new Scanner(System.in);
while (in.hasNext())
{

String n=in.next();
System.out.println (n);
}

può andare bene lo stesso?


da notare che questo algoritmo funziona solo se il for va a rovescio, cioè dall'indice massimo fino a 0

non capisco perché scambiare gli elementi dell'array per far arrivare in una certa posizione quello di interesse; prenditi semplicemente tutte le lunghezze di tutti gli elementi, memorizza man mano l'indice di quella massima che hai trovato, e alla fine ritorna l'elemento che sta a quell'indice.

una cosa del genere direi:

String longest(String inputText)
{
String[] splittedText = inputText.split(" ");

String result = null;
int maximumLength = 0;

for (String word : splittedText)
{
if (word.length() > maximumLength)
{
maximumLength = word.length();
result = word;
}
}

return result;
}


cioè..prendo la lunghezza di ogni stringa e la memorizzo..dove? e come faccio a sapere la lunghezza massima?
Ah, un'altra cosa..il return alla fine del tuo pezzettino di codice vuol dire che mi dovrei creare un nuovo metodo? Scusa, magari sono domande stupide, ma mi sta andando in fusione il cervello :fagiano:

CwNd
03-11-2007, 16:44
una cosa del genere direi:

String longest(String inputText)
{
String[] splittedText = inputText.split(" ");

String result = null;
int maximumLength = 0;

for (String word : splittedText)
{
if (word.length() > maximumLength)
{
maximumLength = word.length();
result = word;
}
}

return result;
}



è quello che volevo suggerire io :)
Comunque, il ciclo for impostato in quel modo come funziona? fa una sorta di for each? non sapevo che in java si potesse fare in questo modo :)

blue_blue
03-11-2007, 16:59
if (word.length() > maximumLength)
{
maximumLength = word.length();
result = word;
}
Forse ho capito questo pezzetto: imposto un valore iniziale per la lunghezza massima e, se la lunghezza della stringa è maggiore, sovrascrivo quel valore..giusto?

Ma questo:
for (String word : splittedText)
cosa vuol dire?

71104
03-11-2007, 17:04
cioè..prendo la lunghezza di ogni stringa e la memorizzo..dove? e come faccio a sapere la lunghezza massima? lascia perdere la parte in neretto, l'ho scritta ma poi scrivendo il codice ho cambiato idea e ho fatto diversamente :D
nel codice infatti non mi sono tenuto l'indice della parola più lunga ma direttamente la parola.

ti spiego come funziona il codice: con la chiamata a split divide il testo in parole e le mette in un array di stringhe (non so manco se " " va bene come espressione regolare, comunque se tu riesci già a dividere il testo con lo Scanner tanto meglio lascia perdere split :)); poi inizializzo maximumLength a 0 e result a null (maximumLength contiene la lunghezza della stringa più lunga che trovo man mano nel for); poi faccio il for, prendo una parola alla volta, ne prendo la lunghezza con length, la confronto con quella massima che ho trovato finora, se è più lunga aggiorno la lunghezza massima con quella appena trovata e aggiorno la variabile result mettendoci il riferimento a quella che finora è la parola più lunga.

Ah, un'altra cosa..il return alla fine del tuo pezzettino di codice vuol dire che mi dovrei creare un nuovo metodo? è indifferente se quel codice lo metti in un metodo a parte o direttamente dentro il main o dentro qualsiasi altro metodo. io ci ho fatto un metodo a parte che ho chiamato "longest", ma l'importante è solo che tu riesca ad ottenere la stringa che nel mio codice viene messa in "result".

71104
03-11-2007, 17:06
if (word.length() > maximumLength)
{
maximumLength = word.length();
result = word;
}
Forse ho capito questo pezzetto: imposto un valore iniziale per la lunghezza massima e, se la lunghezza della stringa è maggiore, sovrascrivo quel valore..giusto? giusto

Ma questo:
for (String word : splittedText)
cosa vuol dire? è il for à la Java 1.4.2 :D
significa praticamente questo:

for (int i = 0; i < splittedText.length; i++)
{
String word = splittedText[i];
...

feyd
03-11-2007, 17:06
if (word.length() > maximumLength)
{
maximumLength = word.length();
result = word;
}
Forse ho capito questo pezzetto: imposto un valore iniziale per la lunghezza massima e, se la lunghezza della stringa è maggiore, sovrascrivo quel valore..giusto?

Ma questo:
for (String word : splittedText)
cosa vuol dire?

E' l'enhanced for loop.
http://java.sun.com/j2se/1.5.0/docs/guide/language/foreach.html
vista la domanda deduco che l'esercizio avesse il doppio scopo di insegnare un po' di algoritmica elementare e le basi di java.
Oltre alla documentazione online ti suggerisco anche di affiancare alla tastiera un buon libro cartaceo su java. Ti assicuro che ne sarai ampiamente ripagato.

feyd

71104
03-11-2007, 17:11
Ti assicuro che ne sarai ampiamente ripagato.
ripagata :D
(vedere firma... capito perché rispondono tutti? :asd: )

feyd
03-11-2007, 17:18
ripagata :D
(vedere firma... capito perché rispondono tutti? :asd: )

avevo comunque un 50% di possibilità di prenderci senza leggere la firma... ho tentato... la statistica era dalla mia parte :D

blue_blue
03-11-2007, 17:36
e io che credevo foste tutti interessati a questo complessissimo algoritmo :asd:

Dunque..dopo due ore di :muro: sono pervenuta a questo:
import java.util.Scanner;


public class ParolaPiuLunga2
{
public static void main (String[] args)
{
Scanner in = new Scanner(System.in);
String[] arrayParole = new String[700];
String parolafinale;
int lunghezzamax = 0;

while (in.hasNext())
{
String n=in.next();
int i= 0;
arrayParole[i] = n;

if (arrayParole[i].length()>lunghezzamax)
{
lunghezzamax = arrayParole[i].length();
parolafinale = arrayParole[i];
System.out.println (parolafinale);
}
i++;
}

}
}
per compilare compila (ed è già una gran cosa :stordita: ), però quando lo mando in esecuzione (java ParolaPiuLunga2 < Manzoni.txt) mi dà come risultato:
Quel
volge
mezzogiorno
restringersi

e non capisco dove sono gli errori..

PS. Manzoni.txt è:
Quel ramo del lago di Como , che volge a mezzogiorno ,
tra due catene non interrotte di monti , tutto a seni e a golfi ,
a seconda dello sporgere e del rientrare di quelli , vien ,
quasi a un tratto , a restringersi , e a prender corso e figura
di fiume , tra un promontorio a destra , e un' ampia costiera
dall' altra parte .

blue_blue
03-11-2007, 17:42
E' l'enhanced for loop.
http://java.sun.com/j2se/1.5.0/docs/guide/language/foreach.html
vista la domanda deduco che l'esercizio avesse il doppio scopo di insegnare un po' di algoritmica elementare e le basi di java.
Oltre alla documentazione online ti suggerisco anche di affiancare alla tastiera un buon libro cartaceo su java. Ti assicuro che ne sarai ampiamente ripagato.

feyd
Sì sì, sono proprio i primi esercizi! come libro ho quello di Cay S. Horstmann (Concetti di informatica e fondamenti di Java)..che ne pensi?

andbin
03-11-2007, 17:43
e non capisco dove sono gli errori..L'array di per sé non servirebbe nemmeno, come è già stato detto basta avere 2 variabili che man mano tengono: la lunghezza e la stringa più lunga.
Comunque l'array lo usi male perché usi una variabile 'i' come indice che è locale al ciclo, pertanto è sempre 0.

Tommy
03-11-2007, 17:56
basta usare uno string tokenizer e il .lenght()... occhio se la stringa in input è lunga e contiene degli '\n' che puoi sostituire con un replaceAll()

blue_blue
03-11-2007, 17:57
L'array di per sé non servirebbe nemmeno, come è già stato detto basta avere 2 variabili che man mano tengono: la lunghezza e la stringa più lunga.
Comunque l'array lo usi male perché usi una variabile 'i' come indice che è locale al ciclo, pertanto è sempre 0.

E' che volevo fare un po' di pratica anche con gli array, già che c'ero..tutto qui :)
Comunque, senza array mi verrebbe così:
import java.util.Scanner;


public class ParolaPiuLunga3
{
public static void main (String[] args)
{
Scanner in = new Scanner(System.in);
String parolafinale;
int lunghezzamax = 0;
while (in.hasNext())
{
String n=in.next();

if (n.length()>lunghezzamax)
{
lunghezzamax = n.length();
parolafinale = n;
System.out.println (parolafinale);
}

}

}
}
e ancora mi dà come risultato quelle 4 parole, e non una sola..:fagiano:

feyd
03-11-2007, 18:05
Sì sì, sono proprio i primi esercizi! come libro ho quello di Cay S. Horstmann (Concetti di informatica e fondamenti di Java)..che ne pensi?

è da moltissimo che non compro un libro introduttivo di java... per cui non sono la persona piu indicata per questo tipo di consigli :D
L'algoritmo invece è sbagliato per un paio di ragioni:
1) se metti la sysout dentro il ciclo è ovvio che ogni volta che trova una parola piu lunga della precedente stampa la nuova parola.
2) l'array oltre che essere inefficiente è limitante... se ti do un testo di 701 parole che fai? Oltretutto non serve a nulla!


package tests;

import java.util.Scanner;

public class ParolaLunga {

/** */
public static void main(String[] args) {

Scanner in = new Scanner(System.in);
String parolafinale = "";

while (in.hasNext()) {
String n = in.next();
if (n.length() > parolafinale.length()) {
parolafinale = n;
}
}
System.out.println(parolafinale);
}

}

può essere una alternativa.
feyd

scappo il bimbo piange.... buoni esperimenti ed in bocca al lupo.
ciao feyd

blue_blue
03-11-2007, 18:25
è da moltissimo che non compro un libro introduttivo di java... per cui non sono la persona piu indicata per questo tipo di consigli :D
L'algoritmo invece è sbagliato per un paio di ragioni:
1) se metti la sysout dentro il ciclo è ovvio che ogni volta che trova una parola piu lunga della precedente stampa la nuova parola.
2) l'array oltre che essere inefficiente è limitante... se ti do un testo di 701 parole che fai? Oltretutto non serve a nulla!
...

scappo il bimbo piange.... buoni esperimenti ed in bocca al lupo.
ciao feyd

Immaginavo..il problema è che se la porto fuori, la variabile parolafinale non è più visibile, e non capisco come sistemare la cosa..
Comunque ti ringrazio per l'aiuto!:)

71104
03-11-2007, 18:39
avevo comunque un 50% di possibilità di prenderci senza leggere la firma... ho tentato... la statistica era dalla mia parte :D facciamo 25%: poteva essere gay :D
ok, i gay sono pochi; facciamo 40% :D

71104
03-11-2007, 18:42
scappo il bimbo piange.... ah ecco, ora capisco come mai non hai notato la firma :asd:
non c'hai più le antenne per queste cose, non sei single :D

71104
03-11-2007, 18:43
Immaginavo..il problema è che se la porto fuori, la variabile parolafinale non è più visibile, e non capisco come sistemare la cosa.. fuori dal while, non dal main!! :D

blue_blue
03-11-2007, 22:44
fuori dal while, non dal main!! :D

:D
ma anche se sposto System.out.println fuori dal while mi dice "variable parolafinale might not have been initialized"..e in effetti io l'ho inizializzata dentro al blocco dell'if..:stordita:

feyd
04-11-2007, 07:57
guarda l'esempio che ti ho postato: la variabile è inizializzata fuori dal ciclo while.
Per inciso: le variabili vanno sempre inizializzate.
Una delle buone regole di programmazione è quella di lasciare gli oggetti sempre in uno stato consistente.
Ciò ha il considerevole vantaggio che meno null hai ingiro minore sarà la probabilità di una NullPointerException a runtime.

feyd

feyd
04-11-2007, 07:58
ah ecco, ora capisco come mai non hai notato la firma :asd:
non c'hai più le antenne per queste cose, non sei single :D

Piano non sono ancora cosi malridotto! :D :D :D Sono ancora giovane per fortuna!

71104
04-11-2007, 09:02
:D
ma anche se sposto System.out.println fuori dal while mi dice "variable parolafinale might not have been initialized"..e in effetti io l'ho inizializzata dentro al blocco dell'if..:stordita: è giusto che ci sia un caso in cui la variabile deve essere ritornata senza che le sia stata assegnata alcuna parola, perché quello è il caso in cui nel testo di input semplicemente non ci sono parole. decidi cosa vuoi ritornare in tale caso: null direi che va bene, quindi basta che al di fuori del while inizializzi a null la variabile che ritorni.

edit - in alternativa potresti anche lanciare un'eccezione da te creata, una classe NoWordsException; oppure semplicemente una InvalidParameterException.

blue_blue
04-11-2007, 20:54
Wow, così funziona, grazie!:D Quindi in ogni caso bisogna inizializzare la variabile fuori dal ciclo di modo che, se il ciclo parte, la variabile assumerà il valore attribuitole nel ciclo, altrimenti avrà comunque un valore, che è quello iniziale..ho capito giusto?? :stordita:
Poi vorrei chiedervi un'altra cosa..il testo che ci ha fornito la prof aveva la punteggiatura volutamente staccata dalle parole..però se io do in pasto al mio programmino un testo che non sia quello della prof, la punteggiatura mi fa aumentare la lunghezza delle parole e quindi mi falsa tutto..per risolvere come potrei fare? Avevo pensato di cambiare le condizioni dell'if così:
if (n.length()>lunghezzamax && (n.charAt(n.length()-1) != ',') && (n.charAt(n.length()-1) != '.') && (n.charAt(n.length()-1) != ';') && (n.charAt(n.length()-1) != '!') && (n.charAt(n.length()-1) != '?'))

ma non so..c'è un metodo più intelligente magari?

71104
04-11-2007, 21:23
Wow, così funziona, grazie!:D Quindi in ogni caso bisogna inizializzare la variabile fuori dal ciclo di modo che, se il ciclo parte, la variabile assumerà il valore attribuitole nel ciclo, altrimenti avrà comunque un valore, che è quello iniziale..ho capito giusto?? :stordita: direi di si :p

Poi vorrei chiedervi un'altra cosa..il testo che ci ha fornito la prof aveva la punteggiatura volutamente staccata dalle parole..però se io do in pasto al mio programmino un testo che non sia quello della prof, la punteggiatura mi fa aumentare la lunghezza delle parole e quindi mi falsa tutto..per risolvere come potrei fare? Avevo pensato di cambiare le condizioni dell'if così:
if (n.length()>lunghezzamax && (n.charAt(n.length()-1) != ',') && (n.charAt(n.length()-1) != '.') && (n.charAt(n.length()-1) != ';') && (n.charAt(n.length()-1) != '!') && (n.charAt(n.length()-1) != '?'))

ma non so..c'è un metodo più intelligente magari? uhm, a questo punto direi di utilizzare lo StreamTokenizer (era quello che ha usato andbin nel suo esempio). qui la documentazione:
http://java.sun.com/javase/6/docs/api/index.html?java/io/StreamTokenizer.html

lo StreamTokenizer ti isola proprio le parole prendendole come tokens di tipo TT_WORD, quindi basta che leggi solo quelle saltando tutti i tokens di tipo diverso.

blue_blue
04-11-2007, 21:47
uhm, a questo punto direi di utilizzare lo StreamTokenizer (era quello che ha usato andbin nel suo esempio). qui la documentazione:
http://java.sun.com/javase/6/docs/api/index.html?java/io/StreamTokenizer.html

lo StreamTokenizer ti isola proprio le parole prendendole come tokens di tipo TT_WORD, quindi basta che leggi solo quelle saltando tutti i tokens di tipo diverso.
Siccome non abbiamo ancora studiato la StreamTokenizer, è lo stesso se uso la StringTokenizer?

EDIT: a parte che non riesco a usare neanche quella..come si fa a dirgli di "tokenizzarmi" il testo in ingresso ( e non una stringa immessa come parametro esplicito)??

okay
04-11-2007, 21:53
Wow, così funziona, grazie!:D Quindi in ogni caso bisogna inizializzare la variabile fuori dal ciclo di modo che, se il ciclo parte, la variabile assumerà il valore attribuitole nel ciclo, altrimenti avrà comunque un valore, che è quello iniziale..ho capito giusto?? :stordita:
Poi vorrei chiedervi un'altra cosa..il testo che ci ha fornito la prof aveva la punteggiatura volutamente staccata dalle parole..però se io do in pasto al mio programmino un testo che non sia quello della prof, la punteggiatura mi fa aumentare la lunghezza delle parole e quindi mi falsa tutto..per risolvere come potrei fare? Avevo pensato di cambiare le condizioni dell'if così:
if (n.length()>lunghezzamax && (n.charAt(n.length()-1) != ',') && (n.charAt(n.length()-1) != '.') && (n.charAt(n.length()-1) != ';') && (n.charAt(n.length()-1) != '!') && (n.charAt(n.length()-1) != '?'))

ma non so..c'è un metodo più intelligente magari?

no non è buono questo metodo...
potrebbe essere ok solo se dopo l'ultimo carattere ci fosse un segno di punteggiatura tipo: casa, oppure word. o ancora word: ma se per caso scrive word, e poi word , non andrebbe bene o ancora word ? ecc ecc.

poi questo:
n.charAt(n.length()-1) != ';'
dovrebbe controllare l'ultimo carattere tipo: word-1 ovvero 'r' e word; 'd'

invece di splittare controlli carattere per carattere e come incontri un segno di punteggiatura o spaziatura ' ' prendi la word trovata.

pseudo code


wordOK=""
contatore=0
riga="ciao come và? sto bene e tu ? bene ,grazie."
//open "file.txt" for input as #1
//while not eof(1)
//input #1, riga
for i=0 i<len(riga)+1
if mid(riga,i,1)=',' or mid(riga,i,1)='?' or mid(riga.i,1)=' '... ecc ecc then
word=mid(riga,contatore,i-1)
if len(word)>len(wordOK) then wordOK=word
contatore=i+1
endif
next i
//wend
print wordOK
end



questo sopra scrivendo in console la riga oppure l'algoritmo vale per la lettura di un file txt togliendo i commenti sopra.
riga è tutta una riga del file testo letto catturata da input#1, riga ad ogni while hai una riga del file testo nella variabile riga che ti vai a controllare carattere per carattere

questa è una versione funzionante in vb6

Dim riga, wordOK, word As String
wordOK = ""
word = ""
contatore = 1
caratteri = 0
riga = "ciao come và? sto bene e tu ? bene ,grazie."
'open "file.txt" for input as #1
'while not eof(1)
'input #1, riga
For cc = 1 To Len(riga)
caratteri = caratteri + 1
If Mid(riga, cc, 1) = "," Or Mid(riga, cc, 1) = "?" Or Mid(riga, cc, 1) = " " Or Mid(riga, cc, 1) = "." Then
word = Mid(riga, contatore, caratteri - 1)
If Len(word) > Len(wordOK) Then wordOK = word
contatore = cc + 1
caratteri = 0
End If
Next cc
'wend


ti stamapa la parola + lunga che è "grazie" anche se la punteggiatura è sballata.

ciao

71104
05-11-2007, 12:27
Siccome non abbiamo ancora studiato la StreamTokenizer, è lo stesso se uso la StringTokenizer? non ho mai avuto occasione di utilizzare lo StringTokenizer, ma dalla documentazione mi pare di capire che ti basterebbe passare al costruttore un set di delimitatori che includano tutti i caratteri di punteggiatura che pensi di incontrare nel testo di input:

StringTokenizer tokenizer = new StringTokenizer(inputText, " \t\n\r\f.,;:!?");





EDIT: a parte che non riesco a usare neanche quella..come si fa a dirgli di "tokenizzarmi" il testo in ingresso ( e non una stringa immessa come parametro esplicito)?? :wtf:
qualunque testo tu abbia suppongo che ce l'avrai in un oggetto String... passalo al primo parametro del costruttore di StringTokenizer, e usa la versione a due parametri, questa cioè:
public StringTokenizer(String str,
String delim)
al secondo parametro passa la stringa dei delimitatori, come quella che ho scritto sopra.

71104
05-11-2007, 12:33
ma se per caso scrive word, e poi word , non andrebbe bene o ancora word ? ecc ecc. se lo Scanner trovasse "word ," si fermerebbe prima della virgola a causa dello spazio, e ritornerebbe solo "word".

poi questo:
n.charAt(n.length()-1) != ';'
dovrebbe controllare l'ultimo carattere tipo: word-1 ovvero 'r' e word; 'd' gli indici che passi al metodo String.charAt sono zero-based: vanno da 0 a String.length() - 1
String.charAt(String.length() - 1) restituisce precisamente l'ultimo carattere.

blue_blue
05-11-2007, 12:49
Ci siamo quasi :D

Sono arrivata a questo:
import java.util.Scanner;
import java.util.StringTokenizer;

public class ParolaPiuLunga3a
{
public static void main (String[] args)
{
Scanner in = new Scanner(System.in);
String parolafinale = null;
int lunghezzamax = 0;
while (in.hasNext())
{
String n=in.next();
StringTokenizer tokenizer = new StringTokenizer(n, ".,;:!?\'");
while (tokenizer.hasMoreTokens())
{
String token=tokenizer.nextToken();

if (token.length()>lunghezzamax)
{
lunghezzamax = n.length();
parolafinale = n;
}
}
}
System.out.println ("la parola piu' lunga e' "
+ parolafinale);
}
}

però..ho provato con un testo e mi ha restituito, come parola più lunga, una parola con la virgola alla fine..ma io gliele ho tolte, le virgole! :cry:

71104
05-11-2007, 14:00
correggi questo:

if (token.length()>lunghezzamax)
{
lunghezzamax = n.length();
parolafinale = n;
}


così:

if (token.length()>lunghezzamax)
{
lunghezzamax = token.length();
parolafinale = token;
}

blue_blue
05-11-2007, 14:38
correggi questo:

if (token.length()>lunghezzamax)
{
lunghezzamax = n.length();
parolafinale = n;
}


così:

if (token.length()>lunghezzamax)
{
lunghezzamax = token.length();
parolafinale = token;
}


grazie :ave:
posso chiedere un'ultima cosa e poi archivio questo programma? :stordita:
Se ci fossero due parole lunghe uguale cosa succederebbe? mi darebbe come risultato solo la prima trovata?

^TiGeRShArK^
05-11-2007, 15:39
giusto

è il for à la Java 1.4.2 :D
significa praticamente questo:

for (int i = 0; i < splittedText.length; i++)
{
String word = splittedText[i];
...

è il for each di java 5 :p
nella java 1.4.2 dovevi ancora usare la versione classica del for ;)

71104
05-11-2007, 16:26
grazie :ave:
posso chiedere un'ultima cosa e poi archivio questo programma? :stordita:
Se ci fossero due parole lunghe uguale cosa succederebbe? mi darebbe come risultato solo la prima trovata? veramente penso l'ultima. una volta che hai trovato la prima tra le più lunghe il ciclo comunque va avanti e continua a sovrascrivere il risultato finché non finisce.

EDIT - ennò!! :D ho detto na cazzata. anche se ne trova una di lunghezza uguale non sovrascrive il risultato perché la comparazione che fa è stretta ( > ), quindi si, trova la prima.


è il for each di java 5 :p
nella java 1.4.2 dovevi ancora usare la versione classica del for ;)
uhm, ma io mi ricordavo che in Diamonds i primi tempi utilizzavamo Java 1.4.2 e abbiamo sempre usato i foreach... :D

^TiGeRShArK^
05-11-2007, 17:49
veramente penso l'ultima. una volta che hai trovato la prima tra le più lunghe il ciclo comunque va avanti e continua a sovrascrivere il risultato finché non finisce.

EDIT - ennò!! :D ho detto na cazzata. anche se ne trova una di lunghezza uguale non sovrascrive il risultato perché la comparazione che fa è stretta ( > ), quindi si, trova la prima.



uhm, ma io mi ricordavo che in Diamonds i primi tempi utilizzavamo Java 1.4.2 e abbiamo sempre usato i foreach... :D

non mi ricordo che cazz usavamo all'inizio.. però il for each è stato introdotto con java 5 :p

Java 5 ha introdotto diversi cambiamenti nel linguaggio che conosciamo. Oltre alle solite nuove classi che prima o poi incontreremo, alle performance migliorate e altre migliorie a destra e a
manca, sono stati introdotti dei cambiamenti proprio nel linguaggio. Vediamo quindi cosa è in grado di fare Java grazie a partire da questa versione

Costrutto foreach

Quest costrutto sarà già conosciuto da chi è conosce linguaggi come il PHP e Perl. Praticamente è un evoluzione del semplice for e viene utilizzato nei casi in cui dobbiamo scorrere tutti gli elementi di una lista, array, collezione.

blue_blue
07-11-2007, 12:33
veramente penso l'ultima. una volta che hai trovato la prima tra le più lunghe il ciclo comunque va avanti e continua a sovrascrivere il risultato finché non finisce.

EDIT - ennò!! :D ho detto na cazzata. anche se ne trova una di lunghezza uguale non sovrascrive il risultato perché la comparazione che fa è stretta ( > ), quindi si, trova la prima.


Ok, allora ci dovrei aver capito qualcosa :D
Eventualmente, se avrò l'ispirazione, tenterò di sistemare anche questo "dettaglio"..altrimenti, sono già contenta di essere arrivata a questo!
Grazie mille a tutti x l'aiuto! :)