Metodo boolean: Stringa che inizia per vocale

di il
11 risposte

Metodo boolean: Stringa che inizia per vocale

Ciao a tutti,

sto provando a fare un metodo all'interno di una classe che mi permetta di capire se una stringa inizi o meno per vocale. Ecco quanto ho concluso:

public boolean beginWithVocale(){
   return this.charAt(0)=="a" ||this. charAt(0)=="e" ||this.charAt(0)=="i" || this.charAt(0)=="o" || this.charAt(0)=="u";
  }
Quando però compilo, mi vengono segnalati ben 5 errori (tutti dello stesso genere):

"error: cannot find symbol
return(charAt(0)=="a"||...);
"

e mi segnala l'errore alla "c" di ogni "charAt(..).

Qualcuno riuscirebbe gentilmente a spiegarmi il motivo? Grazie mille

11 Risposte

  • Re: Metodo boolean: Stringa che inizia per vocale

    Giammarco ha scritto:


    
    public boolean beginWithVocale(){
       return this.charAt(0)=="a" ||this. charAt(0)=="e" ||this.charAt(0)=="i" || this.charAt(0)=="o" || this.charAt(0)=="u";
      }
    
    Innanzitutto un metodo di "utilità" di questo tipo, sarebbe più appropriato se:
    - fosse static (metodo di classe invece che di istanza)
    - avesse come parametro la stringa da testare

    Nel tuo caso il metodo è di istanza ... e cosa è e come è fatta la tua classe? Ha un metodo charAt di istanza? Dubito e se anche ci fosse, sarebbe altamente discutibile a meno che la tua classe come concetto generale rappresenti "una sequenza di caratteri" (una cosa simil-String per intenderci).
  • Re: Metodo boolean: Stringa che inizia per vocale

    andbin ha scritto:


    Ha un metodo charAt di istanza? Dubito e se anche ci fosse, sarebbe altamente discutibile a meno che la tua classe come concetto generale rappresenti "una sequenza di caratteri" (una cosa simil-String per intenderci).
    La mia classe non ha un metodo charAt(), o meglio, non ho definitio nessun metodo del genere. Mia intenzione era quella di richiamare il metodo della classe String. Dove ho fallito? Dovrei forse fare un richiamo alla classe String? Non viene fatto di default?

    Grazie
  • Re: Metodo boolean: Stringa che inizia per vocale

    Giammarco ha scritto:


    La mia classe non ha un metodo charAt(), o meglio, non ho definitio nessun metodo del genere. Mia intenzione era quella di richiamare il metodo della classe String. Dove ho fallito? Dovrei forse fare un richiamo alla classe String? Non viene fatto di default?
    E allora cosa ti aspettavi facendo this.charAt( ... ) ?
    "sto invocando un metodo charAt in questo oggetto"
    Come potrebbe pensare (il compilatore) che vuoi il charAt di String? Lo dovresti invocare su un oggetto String, appunto. La tua classe non è String e non ha comunque un charAt.

    Rileggi i due punti che ti ho indicato prima.
  • Re: Metodo boolean: Stringa che inizia per vocale

    andbin ha scritto:


    E allora cosa ti aspettavi facendo this.charAt( ... ) ?
    "sto invocando un metodo charAt in questo oggetto"
    Come potrebbe pensare (il compilatore) che vuoi il charAt di String? Lo dovresti invocare su un oggetto String, appunto. La tua classe non è String e non ha comunque un charAt.
    L'oggetto (this.) deve infatti essere di tipo String, ma questo dovrebbe riguardare l'utilizzo del metodo, non la sua definizione, o sbaglio? Mi spiego meglio. Quando utilizzo il metodo charAt() lo faccio nel seguente modo:
    oggetto.charAt(numeroIndice)

    E' a questo punto che devo assicurarmi che l' "oggetto" sia di tipo String.
    Quando però definisco un metodo che ha un parametro implicito e che utilizza il metodo charAt() su questo parametro implicito all'interno delle sue istruzioni, non ci dovrebbero essere problemi se lo riferisco ad un eventuale oggetto "this" (che POI dovrò assicurarmi essere di tipo String).

    Quanto mi aspetto è che il compilatore verifichi che l'iniziale (il "char" all'indice "0") sia o uguale ad "a", o ad "e", eccetera.

    (Premetto essere nuovo in Java, quindi potrei benissimo star dicendo fesserie )
  • Re: Metodo boolean: Stringa che inizia per vocale

    Giammarco ha scritto:


    L'oggetto (this.) deve infatti essere di tipo String, ma questo dovrebbe riguardare l'utilizzo del metodo, non la sua definizione, o sbaglio?
    Il "this" potrebbe fare riferimento ad un oggetto String solo se:
    - tu fossi lo sviluppatore del framework standard e stessi operando (scrivendo metodi) nella classe java.lang.String
    - tu potessi estendere String (cosa NON possibile dato che String è final).

    Ovviamente non sei in questi casi, quindi in una tua classe il "this" NON può essere un oggetto String.
  • Re: Metodo boolean: Stringa che inizia per vocale

    andbin ha scritto:


    Il "this" potrebbe fare riferimento ad un oggetto String solo se:
    - tu fossi lo sviluppatore del framework standard e stessi operando (scrivendo metodi) nella classe java.lang.String
    - tu potessi estendere String (cosa NON possibile dato che String è final).

    Ovviamente non sei in questi casi, quindi in una tua classe il "this" NON può essere un oggetto String.
    Quindi per ovviare al problema dovrei definirlo come metodo di classe ed avere come parametro, questa volta esplicito, uno String?

    Non ho ancora capito del tutto peró perché non posso fare riferimento ad oggetti String nella mia class. (Per analogia non potrei impiegare nemmeno oggetti della classe Rectangle, ad esempio?)
  • Re: Metodo boolean: Stringa che inizia per vocale

    Giammarco ha scritto:


    Quindi per ovviare al problema dovrei definirlo come metodo di classe ed avere come parametro, questa volta esplicito, uno String?
    Sì, come metodo statico di "utilità".

    Giammarco ha scritto:


    Non ho ancora capito del tutto peró perché non posso fare riferimento ad oggetti String nella mia class. (Per analogia non potrei impiegare nemmeno oggetti della classe Rectangle, ad esempio?)
    Questo sì è possibile:
    public class MiaClasse {
        private String str;
    
        public boolean strBeginWithVocale(){
            return str.charAt(0)=="a" ||  ..................
        }
    }
    Ma come vedi è str.charAt( ) non this.charAt( )
  • Re: Metodo boolean: Stringa che inizia per vocale

    andbin ha scritto:


    Questo sì è possibile:
    public class MiaClasse {
        private String str;
    
        public boolean strBeginWithVocale(){
            return str.charAt(0)=="a" ||  ..................
        }
    }
    Ma come vedi è str.charAt( ) non this.charAt( )
    Riassumendo quindi non posso usare il metodo charAt() se non comunico al compilatore la certezza che il parametro implicito sia di tipo String?

    (Grazie mille)
  • Re: Metodo boolean: Stringa che inizia per vocale

    Giammarco ha scritto:


    Riassumendo quindi non posso usare il metodo charAt() se non comunico al compilatore la certezza che il parametro implicito sia di tipo String?
    charAt è un metodo come un altro, non è certo speciale. Esiste ad esempio in String/StringBuffer/StringBuilder (perché dettato dalla interfaccia CharSequence).
    Quindi se vuoi invocare il charAt di una stringa, devi assicurarti che l'oggetto sia String o a livello più astratto un CharSequence.
  • Re: Metodo boolean: Stringa che inizia per vocale

    andbin ha scritto:


    charAt è un metodo come un altro, non è certo speciale. Esiste ad esempio in String/StringBuffer/StringBuilder (perché dettato dalla interfaccia CharSequence).
    Quindi se vuoi invocare il charAt di una stringa, devi assicurarti che l'oggetto sia String o a livello più astratto un CharSequence.
    Ho appena provato a modificare il metodo:
    
    private static boolean beginWithVocale(String stringa){
       return (stringa.charAt(0)=="a") || (stringa.charAt(0)=="e") || (stringa.charAt(0)=="i") || (stringa.charAt(0)=="o") || (stringa.charAt(0)=="u");
      }
    
    Gli errori rimangono ancora 5, questa volta però mi viene detto:
    incomparable types: char and String

  • Re: Metodo boolean: Stringa che inizia per vocale

    Giammarco ha scritto:


    Gli errori rimangono ancora 5, questa volta però mi viene detto:
    incomparable types: char and String
    Non l'ho notato subito prima ma avevi quest'errore comunque fin dall'inizio.
    charAt restituisce un char (tipo primitivo) che è una cosa ben diversa da un String con 1 solo carattere!!

    "a" è un String letterale (nota: apici doppi)
    'a' è un char letterale (nota: apici singoli)

    P.S.
    1) Le parentesi che hai messo attorno ad ogni confronto, sono superflue per il compilatore, poiché == ha comunque la precedenza rispetto a || Ma sono comunque utili per chiarire il senso della espressione.
    2) Esiste una forma molto più compatta che sfrutta indexOf di String, ovvero data una stringa con le 5 vocali, cercare lì dentro il carattere. Prova anche questa variante.
Devi accedere o registrarti per scrivere nel forum
11 risposte