Esercizio sulle stringhe. che non funziona.

Stato
Discussione chiusa ad ulteriori risposte.

RedSkull

Utente Electrum
1 Aprile 2008
177
19
0
103
Volevo svolgere un semplice esercizio sulle stringhe in java.
prima l'ho fatto in C e fin quì nessun problema...
ora volevo provarci in java visto che lo sto studiando.
ecco il sorgente:

Codice:
class Stringhe
{
     public static void main(String args[])
     {
         Stringhe a = new Stringhe();
         a.rmDoppie("CCCCCIIIIAAAAOOOOO");
     }
     
     public void rmDoppie(String str)
     {
        int i,conto=0,pos=0;
        String nuova="",removed="";
        
        for(i=0;i<=str.length();i++)
        {
            if(str.charAt(i)==str.charAt(i+1))
            {
                removed.charAt(conto)=str.charAt(i);
                conto++;
            }
            else
            {
                nuova.charAt(pos)=str.charAt(i);
                pos++;
            }
        }
        
        System.out.println("Stringa Completa: "+str);
        System.out.println("Stringa Modificata: "+nuova);
        System.out.println("Lettere Tolte: "+removed);
        System.out.println("Numero Di Lettere Tolte: "+conto);
     }
}
Uso Bluej e quando cerco di compilare mi dà questo errore:
Unexpected type e mi segna di giallo la linea removed.charAt(conto)=str.charAt(i);
come mai ?
quale è l'errore ? a me sembra tutto giusto. cioè memorizzo il carattere presente in str nella posizione iesima in removed nella posizione contesima xD
cosa sbaglio ?
 
credo che la funzione charAt sia una funzione che restituisce il carattere alla posizione i... non puoi usarla per sosituire il carattere alla posizione i
 
Scusa ma non ti basta fare
Codice:
removed += str.substring(i, i+1);
e
Codice:
nuova += str.substring(i, i+1);
 
come prima cosa il metodo charAt(int x),come ha detto Whivel,restituisce un determinato carattere di posizione x,lo ritorna come char e non come String quindi come prima cosa ci sono incompatibilità di tipo di dato,un casting veloce da char a String può essere:
Codice:
""+stringa.charAt(i);
per sostituire un carattere c'è il metodo replace(char a,char b).

http://java.sun.com/javase/6/docs/api/java/lang/String.html#replace(char,%20char)
 
Ma io non devo sostituire nessun carattere devo solo copiare il carattere presente in str nella poszione i dentro removed o nuova nella poszioni corrispondenti.
 
Ok fatto:

Codice:
class Stringhe
{
     public static void main(String args[])
     {
         Stringhe a = new Stringhe();
         a.rmDoppie("CCCCCIIIIAAAAOOOOO");
     }
     
     public void rmDoppie(String str)
     {
        int i,conto=0,pos=0;
        String nuova="",removed="";
        
        for(i=0;i<=str.length();i++)
        {
            if(str.charAt(i)==str.charAt(i+1))
            {
                removed+=str.charAt(i);
                conto++;
            }
            else
            {
                nuova+=str.charAt(i);
            }
        }
        
        System.out.println("Stringa Completa: "+str);
        System.out.println("Stringa Modificata: "+nuova);
        System.out.println("Lettere Tolte: "+removed);
        System.out.println("Numero Di Lettere Tolte: "+conto);
     }
}
Non mi segnala nessun errore, ma quando cerco di avviare il file class mi dà questi errori:
redskull@raptor:Desktop$java -jar ciao.jar
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 18
at java.lang.String.charAt(Unknown Source)
at Stringhe.rmDoppie(Stringhe.java:16)
at Stringhe.main(Stringhe.java:6)
Come mai ?
 
Codice:
for(i=0;i<=str.length();i++)
se parti da 0 arrivi a str.length()-1.... (metti solo < )

esempio
1 2 3 4 = length 4
0 1 2 3 = length 4
 
No darà problema lo stesso perchè nell'if c'è
Codice:
  if(str.charAt(i)==str.charAt(i+1))
quindi quando arriva all'ultimo elemento genera errore ..
io modificherei l'if così
Codice:
if(i != str.length()-1 && str.charAt(i)==str.charAt(i+1))
 
vabbè invece <str.length(), metti <str.length()-1 e poi accodi l'ultimo carattere....

altrimenti l'if di stoner va benissimo (SOLO nei linguaggi che hanno il cortocircuito, come appunto c++ e java. per esempio in vb e vb.net darebbe errore)
 
il cortocircuito indica il fatto che se una parte della condizione implica direttamente il risultato della condizione, allora il resto della condizione non viene valutata....
esempio

if(true || con1 || cond2)
siccome true fa in modo che tutta la condizione sia true, cond1 e cond2 non vengono valutate
se NON ci fosse il corotcircuito valuteresti ancher cond1 e cond2, che potrebbero anche generare degli errori (come nel caso tuo, se appunto non ci fosse il cortocircuito)..

altri esempi

(true || (cond1 && true) && false)
in questo caso cond1 non viene valutato perchè il risultato non influisce (|| true), ma nemmeno quest'ultimo viene valutato, perchè il risultato non influisce (&& false)
 
Ah.. ok... io non lo chiamavo 'cortocircuito' .
Comunque a me sembra una cosa stupida continuare a valutare l'espressione anche se sarà sicuramente falsa (o vera) a prescidere. Ad esempio nel tuo caso sarebbe inutile valutare cond1 e cond2 nel primo if.
Pensa se l'espressione è complessa, perderesti tempo solo per analizzarla..
 
PERFETTO !
Grazie ragazzi non ci avevo fatto caso :)

Codice:
class Stringhe
{
     public static void main(String args[])
     {
         Stringhe a = new Stringhe();
         a.rmDoppie("cciiaaoo");
     }
     
     public void rmDoppie(String str)
     {
        int i,conto=0,pos=0;
        String nuova="",removed="";
        
        for(i=0;i<str.length();i++)
        {
            if(i != str.length() -1 && str.charAt(i)==str.charAt(i+1))
            {
                removed+=str.charAt(i);
                conto++;
            }
            else
            {
                nuova+=str.charAt(i);
            }
        }
        
        System.out.println("Stringa Completa: "+str);
        System.out.println("Stringa Modificata: "+nuova);
        System.out.println("Lettere Tolte: "+removed);
        System.out.println("Numero Di Lettere Tolte: "+conto);
     }
}
 
stoner ha detto:
Ah.. ok... io non lo chiamavo 'cortocircuito' .
Comunque a me sembra una cosa stupida continuare a valutare l'espressione anche se sarà sicuramente falsa (o vera) a prescidere. Ad esempio nel tuo caso sarebbe inutile valutare cond1 e cond2 nel primo if.
Pensa se l'espressione è complessa, perderesti tempo solo per analizzarla..

mi sono capitati casi in cui ho dovuto tirare fuori un'espressione perchè il cortocircuito non me la faceva svolgere, ma anche casi in cui il cortocircuito mi avrebbe fatto comodo.
 
In effetti non sapevo che in vb e vb.net non ci fosse il cortocircuito (neanche io sapevo si chiamasse così ^^ ) e sinceramente non mi vengono in mente svantaggi nel meccanismo, è molto comodo e oltre a farti risparmiare risorse ti da anche una certa "elasticità" per usare qualche trucco e sveltire le cose
 
Stato
Discussione chiusa ad ulteriori risposte.