Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    5

    [Java] Mancata lettura variabile String

    Salve ragazzi,
    per esercitarmi stavo scrivendo un programmino che, data una stringa, verifichi che il numero di caratteri maiuscoli sia uguale al numero di caratteri minuscoli.

    Ecco come l'ho pensato:

    codice:
    public class Uguali {
    	private String str;
    	
    	public Uguali(String str){
    		this.str = str;
    	}
    	
    	public void setStr(String str) {
    		this.str = str;
    	}
    	
    	public String getStr() {
    		return str;
    	}
    	
    //		Metodo controllo
    	
    	public Boolean isCaratteriUguali(){
    		int countLower = 0;
    		int countUpper = 0;
    		for (int i = 0; i<this.str.length(); i++){
    			Character c = ((Character)str.charAt(i));
    
    			if(c.equals(c.toString().toUpperCase()))
    				countUpper++;
    			else 
    				countLower++;
    
    		}
    		
    		boolean valore = false;
    		if(countUpper==countLower)
    			valore = true;
    		return valore;
    		
    		}
    
    }
    E la classe testUguali che esegue:

    codice:
    public class testUguali {
    	public static void main (String[] args){
    		
    		Uguali stringa1 = new Uguali("R1_3j");
    		System.out.println("L'operazione su "+stringa1+" risulta: "+stringa1.isCaratteriUguali());
    
    		}
    	
    }
    Per fare una prova ho istanziato la stringa1 dandogli come valore R1_3j. Una volta lanciato però invece di stamparmi la variabile, mi da il suo indirizzo e di conseguenza il metodo booleano isCaratteriUguali() sarà sempre false. Probabilmente l'errore sarà banale, ma non capisco perchè mi stampi l'indirizzo visto che la classe Uguali ha un costruttore definito correttamente. Dove ho sbagliato?

    Grazie in anticipo!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [Java] Mancata lettura variabile String

    Originariamente inviato da skud
    però invece di stamparmi la variabile, mi da il suo indirizzo
    Ma questo non centra con i tuoi conteggi/test. Hai usato la concatenazione delle stringhe e semplicemente viene invocato toString() sul tuo stringa1 (per ottenere un String da concatenare).
    Ma nella tua classe Uguali NON hai ridefinito toString(), che rimane quindi quello ereditato da Object che ritorna quella forma particolare che hai visto.

    Semplice: ridefinisci public String toString() { ....... }

    Originariamente inviato da skud
    e di conseguenza il metodo booleano isCaratteriUguali() sarà sempre false.
    Ma questo per un motivo: hai un Character e ci invochi equals passandogli un String. Ed è sbagliato (per il equals di Character!)

    Quindi o fai:

    if (c.toString().equals(c.toString().toUpperCase())

    oppure potresti anche evitare tutti i giri di conversioni (ne fai troppe, da char -> Character, poi al fondo da boolean -> Boolean). Evita.

    E comunque ci sarebbe lo stesso un problema di fondo: 1 _ 3 li tratti come "upper" perché toUpperCase non li cambia.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2010
    Messaggi
    5

    Re: Re: [Java] Mancata lettura variabile String

    Originariamente inviato da andbin
    Ma questo non centra con i tuoi conteggi/test. Hai usato la concatenazione delle stringhe e semplicemente viene invocato toString() sul tuo stringa1 (per ottenere un String da concatenare).
    Ma nella tua classe Uguali NON hai ridefinito toString(), che rimane quindi quello ereditato da Object che ritorna quella forma particolare che hai visto.

    Semplice: ridefinisci public String toString() { ....... }

    Ma questo per un motivo: hai un Character e ci invochi equals passandogli un String. Ed è sbagliato (per il equals di Character!)

    Quindi o fai:

    if (c.toString().equals(c.toString().toUpperCase())

    oppure potresti anche evitare tutti i giri di conversioni (ne fai troppe, da char -> Character, poi al fondo da boolean -> Boolean). Evita.

    E comunque ci sarebbe lo stesso un problema di fondo: 1 _ 3 li tratti come "upper" perché toUpperCase non li cambia.
    Ti ringrazio. Ho fatto l'override di toString() ed adesso funziona. Adesso penso a pulire il codice e gestire il problema degli interi e dei caratteri speciali che mi hai fatto notare.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.