Newsgroup: it.comp.java
Titolo: Operazioni su Stringhe (Consigli)!

Ciao a tutti,
volevo chiederVi consigli relativamente ad una gestione di caratteri
all'interno di Stringhe.
Utilizzando il Metodo Substring riesco a gestire il tutto, pero' 
vorrei capire se esiste (e penso proprio di si) qualche altro Metodo
un po' piu' elegante per effettuare quanto segue:
Leggo da Oracle un campo Stringa di 8 caratteri.
Questa stringa potrebbe contenere il carattere - (trattino).
Se presente devo togliere il carttere e compattare la Stringa.
Esempio:
Stringa "ABC-DE" deve diventare "ABCDE" oppure
Stringa "A-BCDE" deve diventare "ABCDE", etc...
Bye.
Lucilla.
-- 
Posted via Mailgate.ORG Server - 
http://www.Mailgate.ORG

O usi indexOf e substring o usi (consigliato) replace

 writes:
LM> Ciao a tutti,
LM> Leggo da Oracle un campo Stringa di 8 caratteri.  Questa stringa
LM> potrebbe contenere il carattere - (trattino).  Se presente devo
LM> togliere il carttere e compattare la Stringa.
Questa  parrebbe  proprio  "pappa"  per le  espressioni  regolari,  il
Pattern  dovrebbe usare  la  regexp \([^-]*\)-\([^-]\)  ed il  Matcher
dovrebbe usare $1$2 come "replacement".
Temo  tuttavia  che  per un  pattern  così  semplice  e per  un  input
consistente  la cosa diventi  poco efficiente  (un matcher  creato per
ogni stringa, ad esempio).
Vista la banalità  del pattern e dell'operazione, nonché  il fatto che
ogni stringa non ha più di  8 caratteri (possibilmente meno di 8 se su
Oracle è  un VARCHAR) io farei  un bel loop usando  il metodo charAt()
per  individuare ogni  singolo carattere,  e se  questo non  è  "-" lo
accodi  ad  uno  StringBuffer,  la  stringa finale  la  ottieni  dallo
StringBuffer a fine ciclo.
Se devi  lavorare su un  recordset ti conviene creare  lo StringBuffer
all'inizio e svuotarlo ad ogni nuova stringa da elaborare.
Fare tanto taglia  e cuci di stringhe, anche  se facile da codificare,
può  non  essere  efficiente   in  quanto  le  stringhe  sono  oggetti
immutabili e ne  vengono quindi creati sempre di  nuovi sullo heap. Lo
StringBuffer è molto più efficiente nella gestione della memoria.
-- 
 /\            ___
/___/\__|_|\_|__|___Gian Uberto Lauri_____________________
  //--\ | | \|  |   Integralista GNUslamico  
\/		    e allevatore di bug da competizione

 O usi indexOf e substring o usi (consigliato) replace
Scusa, potresti farmi un esempio di Replace ?
Cioa e grazie.


 writes:
p> O usi indexOf e substring o usi (consigliato) replace
                                                 ^^^^^^^
Già, dimenticavo.  Che a naso  fa quello che descrivevo  nella seconda
parte del mio post.
<semiserio> 
Visto che l'input è al più di otto caratteri, si potrebbe usare questa
duffizzando il loop :)
0001     public String foo(String ingresso) {
0002 	// buffer è un membro privato della classe che contiene foo
0003 	buffer.delete(0, buffer.length());
0004 
0005 	int i = 0;
0006 	char c;
0007 	StringBuffer bar; // questo serve solo per far contenta la
0008 			  // sintassi 
0009 
0010 	switch (8 - ingresso.length()) {
0011 	case 0:
0012 	    c = ingresso.charAt(i++);
0013 	    bar = (c=='-')?null:buffer.append(c);
0014 
0015 	case 7:
0016 	    c = ingresso.charAt(i++);
0017 	    bar = (c=='-')?null:buffer.append(c);
0018 
0019 	case 6:
0020 	    c = ingresso.charAt(i++);
0021 	    bar = (c=='-')?null:buffer.append(c);
0022 
0023 	case 5:
0024 	    c = ingresso.charAt(i++);
0025 	    bar = (c=='-')?null:buffer.append(c);
0026 
0027 	case 4:
0028 	    c = ingresso.charAt(i++);
0029 	    bar = (c=='-')?null:buffer.append(c);
0030 
0031 	case 3:
0032 	    c = ingresso.charAt(i++);
0033 	    bar = (c=='-')?null:buffer.append(c);
0034 
0035 	case 2:
0036 	    c = ingresso.charAt(i++);
0037 	    bar = (c=='-')?null:buffer.append(c);
0038 
0039 	case 1:
0040 	    c = ingresso.charAt(i++);
0041 	    bar = (c=='-')?null:buffer.append(c);
0042 
0043 	}
0044 
0045 	return buffer.toString();
0046     }
(Si, non mi fa affatto piacere che il Duff's Device non si compili in Java)
</semiserio>


 writes:
p> O usi indexOf e substring o usi (consigliato) replace
GUL>                                                  ^^^^^^^
GUL> Già, dimenticavo.
Già  pirlotto di  un Gian,  dimenticavi di  leggere con  attenzione la
firma di replace().
Purtroppo i parametri di ingresso di replace sono di tipo char, '' non
è una costante valida e quindi non si può usare.


> O usi indexOf e substring o usi (consigliato) replace
LM> Scusa, potresti farmi un esempio di Replace ?
Purtroppo la replace non si puň usare.
Puoi usare il metodo replaceAll() o il metodo replaceFirst() di String
(replaceAll() se  c'č piů  di un trattino),  ma potrebbero  non essere
efficienti  (sono solo  delle scorciatoie  per fare  quello  che avevo
indicato nel mio primo post di questo thread).
Puoi fare 
nuova = vecchia.replaceFirst("([^-]*)-([^-]*)","$1$2");


Sorry, nella fretta mi sono perso l'All (replaceAll).
Come ti usa te l'ha già scritto Gian.
L'altro modo è così:
		String s = "a-b--c";
		StringBuffer sb = new StringBuffer();
		for (int i=0; i<s.length(); i++){
			if (s.charAt(i)!= '-'){
				sb.append(s.charAt(i));
			}
		}
		s = sb.toString();

 nuova = vecchia.replaceFirst("([^-]*)-([^-]*)","$1$2");
non capisco il perche' di questa regexp. secondo me basta fare:
nuova = vecchia.replacaAll("-","");
o replaceFirst...
bsh % System.out.println("AAA-A---A-A".replaceAll("-",""));
AAAAAA

 writes:
m> non capisco il perche' di questa regexp. secondo me basta fare:
m> nuova = vecchia.replacaAll("-","");
Indubbiamente. Mi era "rimasta in testa" una regexp precedente...


0008 		s = sb.toString();
Versione più  seria, valida per  input di ogni dimensione,  del codice
che avevo scritto  per gioco² (ma che è un  infinitesimo più veloce ma
limitata a stringhe di max 8 caratteri :) :)).
-- 
 /\            ___
/___/\__|_|\_|__|___Gian Uberto Lauri_____________________
  //--\ | | \|  |   Integralista GNUslamico  
\/		    e allevatore di bug da competizione
²programmare è un  divertimento... come gioco può esser  simile a dare
testate  sul  muro, ma  con  minor  possibilità  di avere  una  ricom-
pensa. Oppure la cosa più divertente che puoi fare coi vestiti addosso
- i vestiti non sono obbligatori.

 wrote in message
news:1143643220....@v46g2000cwv.googlegroups.com
Grazie....mi sembra una buona soluzione....!!!
