PDA

View Full Version : JAVA STRINGHE


anna182
21-05-2004, 07:32
qlc sa spiegarmi come faccio a contare i caratteri che compongono una stringa??:confused:
siccome se la mia stringa ha 16 caratteri significa che e il codice che mi serve....

Hawke
21-05-2004, 07:50
Per contare i caratteri di una stringa puoi usare il metodo length().

Byez
Hawke

cn73
21-05-2004, 08:39
La classe String è fondamentale. Devi conoscere bene i suoi metodi. Ma la usi la doc delle API?? http://java.sun.com/j2se/1.4.2/docs/api/java/lang/String.html

thefrog
21-05-2004, 08:49
nomestringa.length()

se per esempio devi scandire la stringa ti fai:


for (int i = 0;i<nomestringa.length();i++)
{

}

se usi javadoc vedrai che questi dubbi te li togli in 2 minuti.
si possono consultare su internet o scaricarli (sono una 30ina di mb)

ciao

anna182
21-05-2004, 09:11
grazie per la risp...scritta cosi la mia domanda sembrava un po scema pero il fatto e che nn so come distinguere due stringhe...e un po un casino....:cry:

thefrog
21-05-2004, 09:41
le potresti scandire un carattere alla volta e quando uno è diverso sai che sono diverse oppure potresti usare il compareTo ma nn mi ricrdo la sintassi..........


se ci spieghi un pò meglio cosa devi fare magari si risolve in un attimo....

Angus
21-05-2004, 09:43
Originariamente inviato da Hawke
Per contare i caratteri di una stringa puoi usare il metodo length().

Byez
Hawke


Se sei l'Hawke che conosco da anni... *Benvenuto*


per sapere se due stringhe s1 e s2 sono diverse basta constrollare che non siano uguali col metodo equals()

thefrog
21-05-2004, 09:51
Originariamente inviato da Angus

Se sei l'Hawke che conosco da anni... *Benvenuto*


per sapere se due stringhe s1 e s2 sono diverse basta constrollare che non siano uguali col metodo equals()

porc!
nn ci avevo pensato!

Hawke
21-05-2004, 09:56
Originariamente inviato da Angus

Se sei l'Hawke che conosco da anni... *Benvenuto*


per sapere se due stringhe s1 e s2 sono diverse basta constrollare che non siano uguali col metodo equals()


;)

anna182
21-05-2004, 10:02
hihi beh...
HO una stringa che invio tramite socket che e composta da 16 caratteri e sarebbe il codice letto da un ibutton...e in piu invio al socket dei comandi tipo ("apri" , "stato" ecc) ora come potrei fare secondo voi a far capire al server quale e un codice ibutton e quale e un comando?? avevo pensato alla lunghezza ma forse un giorno ci sara un comando lungo 16 caratteri...oppure a mettere un carattere di riconoscimento davanti alla stringa tipo i x ibutton e c x comando ma e poco furbo per quanto riguarda la sicurezza...boh voi come fareste??

cn73
21-05-2004, 10:07
Originariamente inviato da thefrog
nomestringa.length()

se per esempio devi scandire la stringa ti fai:


for (int i = 0;i<nomestringa.length();i++)
{

}

se usi javadoc vedrai che questi dubbi te li togli in 2 minuti.
si possono consultare su internet o scaricarli (sono una 30ina di mb)

ciao

Non puoi accedere ai singoli caratteri di una stringa come in un array di char. Ovvero non è lecito un accesso di questo tipo
String mystringa="ciao";
char c = mystringa[i].

Se si ha bisogno di un'accesso di questo tipo si adopera il metodo toCharArray() sulla stringa,l oppure si usa il metodo substring(...) appropriato.

Per quel che riguarda il confronto tra stringhe, si deve prestare attenzione a non incorrere nell'errore banale di testare


String s1 = "ciao"
String s2 = "ciao"

if (s1 == s2) restituisce false



Infatti s1 e s2 sono 2 differenti puntatori a 2 locazioni differenti di memoria. Allora si usa il metodo s1.equals(s2) se si deve tstare la sola uguaglianza, oppure il metodo s1.compareTo(s2) il cui risultato ci da informazioni su quale delle 2 sia lessicograficamente maggiore.

Anna spiegaci il problema che ti aiutiamo ;)

cn73
21-05-2004, 10:14
Cioè hai una stringa e devi intercettare il comando che rappresenta??
allora un approccio corretto è questo:

Definisci delle COSTANTI per i comandi (se un giorno dovessero cambiare cambi solo quelle e non in tutte le parti del codice).


final static String APRI="apri"

if (tuaStringaCheContieneIlCOmando.indexOf(APRI) != -1)
gestisciApertura();



Ilmetodo indexOf:


public int indexOf(String str)
Returns the index within this string of the first occurrence of the specified substring. The integer returned is the smallest value k such that:
this.startsWith(str, k)

is true.
Parameters:
str - any string.
Returns:
if the string argument occurs as a substring within this object, then the index of the first character of the first such substring is returned; if it does not occur as a substring, -1 is returned.
Throws:
NullPointerException - if str is null.

anna182
21-05-2004, 10:23
no uffi non riesco a spiegarmi....:cry:
allora il mio server riceve queste due stringe per esempio:

"0B00000034D4D602"
e
"Apri"
ora la prima e il codice di un ibutton la seconda e un comando...
per ora io avevo creato due if:

if(str.equals("0B00000034D4D602")){
String IDUtente = "0B00000034D4D602";
String IDPorta = "5B0000018A1B5409";
verificaAccessi(IDUtente, IDPorta);
if(str.equals("Apri")){
System.out.println("Ho ricevuto la richiesta di apertura della porta");
ApriPorta();
}

solo che strutturato cosi non va bene siccome il giorno in cui avro 200 utenti dovro mettere 200 if fatti cosi:

if(str.equals("0B00000034D4D602")){
String IDUtente = "0B00000034D4D602";
String IDPorta = "5B0000018A1B5409";
verificaAccessi(IDUtente, IDPorta);
if(str.equals("0E0000008F33A802")){
String IDUtente = "0E0000008F33A802";
String IDPorta = "5B0000018A1B5409";
verificaAccessi(IDUtente, IDPorta);

}
....ecc
quindi come faccio a far capire al server in modo semplice veloce e sicuro che la stringa fatta cosi:"0E0000008F33A802"(per esempio)
e un codice e nn un comando???

cn73
21-05-2004, 10:34
Bhè qui devi decidere delle specifiche restrittive tu:

Ad esempio potresti nel caso più semplice affermare ch un comando è formato da soli caratteri alfabetici e invece in ID da caratteri alfanumerici.
In questo modo basterebbe testare, attraverso i metodi della classe Character, se esiste un digit (cifra):


char charArray[] = quelloCheArriva.toCharArray();
for (int i=0; i<charArray.length;i++) {
Character c = new Character(charArray[i]);
if (c.isDigit())
return true;

}
return false;

Angus
21-05-2004, 10:35
Originariamente inviato da anna182
i...oppure a mettere un carattere di riconoscimento davanti alla stringa tipo i x ibutton e c x comando ma e poco furbo per quanto riguarda la sicurezza...boh voi come fareste??

in che senso poco furbo?

cmq dovresti cercare di formalizzare meglio il problema per schiarirti lle idee. Se quello che hai in mente è un vero e proprio "linguaggio" allora non puoi fare altro che studiartene la grammatica e sperare che sia riconoscibile da un parser. Altrimenti puoi usare l'approccio delle costanti cercando di mantenere ben separati anche a livello logico i comandi riconosciuti dal resto, magari utilizzando la semantica delle
espressioni regolari (vedi String.matches(String regex)).

anna182
21-05-2004, 11:00
purtroppo per me il mio livello di conoscienze di java e mooooolto basso e al mio prof nn vanno mai bene le mie idee per quello cercavo un vostro consiglio x distinguere le due stringhe....:cry:

cn73
21-05-2004, 11:14
Queste decisioni devi prenderle tu. Una soluzione intelligente sarebbe, come hai giustamente intuito, di mettere un prefisso (mi raccomando, definito come COSTANTE. Però non sempre è una soluzione fattibile, perchè ad esempio la stringa deve avere una lunghezza massima già interamente occupata.

Soluzione ancora più intelligente, e se il tuo prof rompe mandalo qui da noi :D, è quella di creare 2 classi distinte per Codici e Comandi, entrambe dovranno estendere String

class Comando extends String

class Codice extends String

entrambe sono a tutti gli effetti delle Stringhe (e come tali puoi trattarle), ma al momento del test potrai chiederti:

stringaCheArriva instanceof (Comando) ???

Ovvero potrai testare il tipo di istanza ;)

Angus
21-05-2004, 11:14
Originariamente inviato da anna182
quindi come faccio a far capire al server in modo semplice veloce e sicuro che la stringa fatta cosi:"0E0000008F33A802"(per esempio)
e un codice e nn un comando???

ma il codice è sempre un numero esadecimale? se così fosse potresti provare con:

try {
Integer.parseInt(str, 16);
/*
se arrivo qui vuol dire che str rappresenta un numero esadecimale
quindi lo tratto come un codice valido
*/
String IDPorta = "5B0000018A1B5409";
verificaAccessi(str, IDPorta);
...
} catch (NumberFormatException ex) {
/*
non è un codice, probabilmente è un comando
quindi provo a vedere se str.equals(COSTANTE_COMANDO)
*/
...
}

thefrog
21-05-2004, 11:14
nn so se è una cazzata ma nn puoi identificare il tipo di stringa a priori?
tipo con due nomi di variabili diversi?

forse nn ho colto il problema...

cn73
21-05-2004, 11:16
Originariamente inviato da thefrog
nn so se è una cazzata ma nn puoi identificare il tipo di stringa a priori?
tipo con due nomi di variabili diversi?

forse nn ho colto il problema... Hai fatto centro ;) poco più su spiego come fare...

Angus
21-05-2004, 11:18
Originariamente inviato da cn73
e se il tuo prof rompe mandalo qui da noi :D

già, non demoralizzarti fagli vedere chi sei!!!

anna182
21-05-2004, 12:30
GRAZIE A TUTTI per l'aiuto!!!!
hiih mi piacerebbe a lui nn va mai bene niente perche odia ammettere che qlc ha ragione....
spero di aver capito tutto e di poter risolvere il problema entro poco tempo...
qlc di voi conosce bene le thread??

Angus
21-05-2004, 12:45
Originariamente inviato da anna182
qlc di voi conosce bene le thread??

prova a chiedere che magari qualcuno conosce la risposta

anna182
21-05-2004, 12:50
non ce una risposta e che deve "trasformare" una classe in thread e nn so nemmeno da che parte cominciare...

thefrog
21-05-2004, 12:52
vedi PVT che mi hai mandato:

io nn ho mai fatto niente del genere di quello che stai facendo te cmq se ti fai una variabile "Comando" e una "Codice" e via via gli passi i valori il problea di distinguere non esiste perchè quando andrà a leggere il comando troverà una sequenza di lettere e numeri o quello che vuoi, stessa cosa per il codice, senza bisogno di cercare sotterfugi per distinguere l'uno dall'altro, potranno tranquillamente avere le stesse caratteristiche, tanto lui saprà già che dovrà indentificare la variabile Comando come un comando e la variabile Codice come un codice.....

chiaro?

anna182
21-05-2004, 12:59
ok chiaro pero come faccio ad assegnare a comando e a codice un valore differente ogni volta???

thefrog
21-05-2004, 13:08
Originariamente inviato da anna182
ok chiaro pero come faccio ad assegnare a comando e a codice un valore differente ogni volta???

ma fino ad ora come facevi ad assegnarli?

si tratta semplicemente di passare un valore ad una variabile, poi non so se il tuo contesto implichi qualche difficoltà particolare...

anna182
21-05-2004, 13:10
fino ad ora avevo una variabile sola...String str... allora devo creare due funzioni sendToSocket...giusto?? provvedero...:mad:

Angus
21-05-2004, 13:15
Originariamente inviato da anna182
nn so nemmeno da che parte cominciare...

puoi sempre cominciare dal leggere le API della classe java.lang.Thread e dell'interfaccia java.lang.Runnable, sono abbastanza chiare.
Comunque di solito basta che la tua classe implementi Runnable e che quindi abbia il metodo run(), se ricordo bene.

cn73
21-05-2004, 13:34
Allora...non fare confusione! :D Risolviamo il primo problema:
Hai una sola stringa e vuoi distinguerla.

Innanzitutto ti ho detto una bagianata...non si possono estendere delle classi final, e java.lang.String è una final class. Mi scuso per averti confuso le idee... Comunque è un ostacolo aggirabile se tu non sei vincolata a trattare una Stringa

Partiamo da questo. Puoi usare degli oggetti?

anna182
21-05-2004, 13:37
oggetti in che senso?? credo di si se e nel senso che intendo io....;)

anna182
21-05-2004, 13:38
Originariamente inviato da Angus
puoi sempre cominciare dal leggere le API della classe java.lang.Thread e dell'interfaccia java.lang.Runnable, sono abbastanza chiare.
Comunque di solito basta che la tua classe implementi Runnable e che quindi abbia il metodo run(), se ricordo bene.

ok...ti ricordi benen
:D il problema e che il mio programma e gia fatto pero ora devo mettere una funzione (che ho gia fatto) in un thread...solo che poi mi pasticcia tutto e nn so come cavarmela...

cn73
21-05-2004, 13:43
Allora non passare una String, ma un oggetto da te creato simile a questo:



public class Messaggio implements java.io.Serializable{

final static int CODE = 0;
final static int COMAMND = 1; //di default


private String message;
private int type;

public Messaggio(String message) {
this(message,COMMAND);
}

public Messaggio(String message, int type) {
this.message=message;
this.type=type;
}

public String getMessage() {
return message;
}

public String getType() {
return type;
}

public boolean isCode() {
return (type == CODE);
}

}

Capirai che il server quando riceve un oggetto di questo tipo, può facilmente distinguere se è un Codice o un Comando usando uno dei metodi getType() o isCode();

Angus
21-05-2004, 13:49
Originariamente inviato da cn73
Allora non passare una String, ma un oggetto da te creato simile a questo:



public class Messaggio implements java.io.Serializable{

...

public boolean isCode() {
return (message == 0);
}
...

}



dovrebbe essere:

public boolean isCode() { return type == CODE; }

cn73
21-05-2004, 13:51
Yes ;)

Angus
21-05-2004, 13:54
Originariamente inviato da anna182
ora devo mettere una funzione (che ho gia fatto) in un thread

public class MioRunnable implements Runnable {

public MioRunnable(ClasseCheContieneIlMioMetodo c) {
this.c = c;
}

public void run() {
c.mioMetodo(...);
}

private ClasseCheContieneIlMioMetodo c;

}

altrove, se c è un'istanza di ClasseCheContieneIlMioMetodo:

new Thread(c).start();

anna182
21-05-2004, 14:10
Originariamente inviato da Angus
public class MioRunnable implements Runnable {

public MioRunnable(ClasseCheContieneIlMioMetodo c) {
this.c = c;
}

public void run() {
c.mioMetodo(...);
}

private ClasseCheContieneIlMioMetodo c;

}

altrove, se c è un'istanza di ClasseCheContieneIlMioMetodo:

new Thread(c).start();

help...data la mia ignoranza puoi spiegare tutto piano piano...???
:eek: :(

Angus
21-05-2004, 14:24
supponiamo che tu abbia implementato la funzione (che vuoi mettere in un thread) come metodo f() della classe C:

public class C {
...
public ... f(...) { ... }
...
}

scrivi una classe che implementi Runnable che al momento opportuno invocherà la tua funzione f():

public class R implements Runnable {

// costruttore
public R(C istanzaDiC) {
this.c = istanzaDiC;
}

// implementi il metodo run() richiesto dall'interfaccia Runnable
public void run() {
c.f(...);
}

// campo privato che contiene l'istanza di C
private C c;

}

ora, nel punto del tuo codice dove vuoi che parta il nuovo thread, supposto che tu abbia a disposizione un'istanza c della classe C,

new Thread(new R(c)).start();

a questo punto è partito un nuovo thread che come prima cosa ha invocato il metodo run() di R, che invoca la tua funzione f().

anna182
21-05-2004, 14:29
ok capito...il problema e che io ho una classe principale che crea un frame, poi ho class Lettore() che contiene una funzione leggi che viene richiamata dal main...ecco e questo (tranne il frame) dovrebbe essere in run()...capisci dove sta il pasticcio?? almeno secondo me....:cry:

Angus
21-05-2004, 14:37
ma chi contiene il metodo main()??

non riesco a seguirti :confused:

anna182
21-05-2004, 14:44
la classe FormLeggi...

cn73
21-05-2004, 14:52
Se non ho capito male :D la tua classe lettore deve estendere Threads e implementarne i metodi... nel main chiemerai la nuova istanza di Lettore facendo partire il Thread.

Pr curiosità...ma sei alle superiori?? VI fan fare già ste cose?

Angus
21-05-2004, 15:03
[modalità indovino]
allora FormLeggi ha il metodo main(). Nel main() viene instanziato un Lettore() che fa il suo sporco lavoro...
[/modalità indovino]

quando devi far partire un thread? cosa deve accadere in ogni thread?
... ma soprattutto, perchè hai bisogno dei thread?

ammetto i limiti della mia capacità di intuizione :( :mc:

sorry

anna182
21-05-2004, 15:04
Originariamente inviato da cn73
Se non ho capito male :D la tua classe lettore deve estendere Threads e implementarne i metodi... nel main chiemerai la nuova istanza di Lettore facendo partire il Thread.

Pr curiosità...ma sei alle superiori?? VI fan fare già ste cose?

eh si...all'ultimo anno delle superiori...ma nn in italia...sto facendo una scuola in informatica ma nn ci capisco nulla...mi sa che cambio campo...cmq hai centrato in pieno il problema...mo come fo a risolverlo???:D

anna182
21-05-2004, 15:07
Originariamente inviato da Angus
[modalità indovino]
allora FormLeggi ha il metodo main(). Nel main() viene instanziato un Lettore() che fa il suo sporco lavoro...
[/modalità indovino]

quando devi far partire un thread? cosa deve accadere in ogni thread?
... ma soprattutto, perchè hai bisogno dei thread?

ammetto i limiti della mia capacità di intuizione :( :mc:

sorry

eheh piu che altro sono io che nn so spiegare...
il mio thread deve avviarsi subito quando viene creata la form e deve controllare se un ibutton si collega al lettore o meno...quindi deve usare: lettore.leggi();....se trova l'ibutton collegato deve mandarlo al server tramite socket ma deve continuare a vedere se se ne collega un altro oppure se il gettone viene scollegato....
ufff...che faticaccia...