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

    [JAVA] problema else if

    Salve a tutti ragazzi ho un problema con il costrutto else if
    Questo è ciò che devo realizzare :
    codice:
    L'inserimento di un elemento può essere impedito a causa dei seguenti casi:
    1. L'identificatore è già presente nel contenitore;
    2. La stringa è nulla;
    3. Il contenitore è pieno;
    4. L'identificatore non è un intero positivo
    Anziché restituire un valore Boolean, il servizio restituirà una delle seguenti costanti intere,
    definite nella classe StringPool e rese pubbliche:
     SUCCESS se l'inserimento è avvenuto correttamente;
     KO_DUPLICATE_FOUND se si è verificato il caso 1;
     KO_NULL_STRING se si è verificato il caso 2;
     KO_FULL_POOL se si è verificato il caso 3.
     ID_NOT_VALID se si è verificato il caso 4.
    Ho due problemi :
    1) se cerco d'inserire un elemento che è un " KO_DUPLICATE_FOUND" alla posizione successiva alla 0 il programma mi restituisce SUCCESS al posto di ko_duplicate_found
    2) se tento di d'inserire un elemento nella prima posizione libera lo inserisce sempre alla prima posizione fregandosene del controllo di ko_duplicate_found.
    codice:
    public class StringUtils {
    	
    	private StringUtils[] str;
    	
    	public StringUtils(int newId, String newString){
    		identifier = newId;
    		nomeid = newString;
    	}
    	
    	public StringUtils(int n){
    		str = new StringUtils[n];
    	}
    	
    	public StringUtils(StringUtils[] d){
    		str = d;
    	}
    	
    	public int getID(){
    		return identifier;
    	}
    	public String getNomeID() {
    		return nomeid;
    	}
    
    	public int add(int id, String word){
    		int n = str.length;
    		int statment = 0;
    		for(int i = 0; i < n; i++){
    			if(str[i].getID() == id){
    				System.out.println("duplicate found");
    				return statment = KO_DUPLICATE_FOUND;
    			}
    			else if(word == ""){
    				System.out.println("null string");
    				return statment = KO_NULL_STRING;
    			}
    			else if(str[i] == null && i < n){
    				System.out.println("full pool");
    				return statment = KO_FULL_POOL;
    			}
    			else if(id < 0 ){
    				System.out.println("id non valido");
    				return statment = ID_NOT_VALID;
    			}
    			else{
    				str[i] = new StringUtils(id,word);
    			System.out.println("STRING_POOL_SUCCES Code Return : " + STRING_POOL_SUCCESS);
    			return statment = STRING_POOL_SUCCESS;}
    		}
    		return statment;
    	}
    	
    	/**
    	 * recupera il nome di una stringa in base all'id.
    	 * @param recupero l'id da inserire
    	 */
    	public  void recuperoStringa(int recupero) {
    		int j = 0;
    		int n = str.length;
    		int posizione = -1;
    		while(( j < n ) && posizione == -1 ) {
    			if(str[j].getID() == recupero)
    				posizione = j;
    			j++;
    		}
    		System.out.println(str[posizione].getNomeID());
    	}
    	
    	
    	private  int identifier;
    	private  String nomeid;
    	//rimozione o inserimento avvenuto con successo
    	final int  STRING_POOL_SUCCESS = 0;
    	//identificatore già presente nel contenitore
    	final int KO_DUPLICATE_FOUND = 1;
    	//la stringa è nulla
    	final  int KO_NULL_STRING = 2;
    	//il contenitore è pieno
    	final  int KO_FULL_POOL = 3;
    	//l'identificatore non è un intero positivo
    	final int ID_NOT_VALID = 4;

  2. #2
    Utente di HTML.it L'avatar di oronze
    Registrato dal
    Jun 2001
    Messaggi
    3,543
    codice:
    public int add(int id, String word){
    		int n = str.length;
    		int statment = 0;
    		for(int i = 0; i < n; i++){
    			if(str[i].getID() == id){
    				System.out.println("duplicate found");
    				return statment = KO_DUPLICATE_FOUND;
    			}
    			else if(word == ""){
    				System.out.println("null string");
    				return statment = KO_NULL_STRING;
    			}
    			else if(str[i] == null && i < n){
    				System.out.println("full pool");
    				return statment = KO_FULL_POOL;
    			}
    			else if(id < 0 ){
    				System.out.println("id non valido");
    				return statment = ID_NOT_VALID;
    			}
    			else{
    				str[i] = new StringUtils(id,word);
    			System.out.println("STRING_POOL_SUCCES Code Return : " + STRING_POOL_SUCCESS);
    			return statment = STRING_POOL_SUCCESS;}
    		}
    		return statment;
    	}
    1) visto che negli if hai un return non ti serve usare il costrutto else if...ti bastano solo tanti if perchè, non appena uno si verifica il metodo restituisce un valore "terminando" la sua esecuzione
    2) immagino che tu ti stia costruendo una struttura dati e il metodo add lo invochi quando aggiungi un elemento a tale strutura....quindi l'if(word == "") non ha senso metterlo nel ciclo for in quanto così verà controllato n volte ma a te basta che venga controllato una sola volta
    3) if(str[i] == null && i < n) non mi è chiaro...se vuoi sapere se il contenitore è pieno dovresti verificare che str[i] NON sia null e, soprattuto la condizione i<n è sempre vera nel ciclo for quindi non ha senso aggiungerla....ti dirà di più...la tua struttura dati, per evitare questo controllo, io la cambierei aggiungendo un contatore che aumenta e decresce in base all'inserimento, cancellazione di un oggetto dalla struttura...in questo modo, quando invochi .add() ti basta controllare che contatoreElementi != n evitando così n-1 if
    4) if(id < 0 ) è come il punto 2. Dovrebbe stare fuori dal for

    detto ciò, ammesso che non mi sfugga nulla, come modificheresti il metodo add della tua struttura dati?

    No ai layout tabellari!

    Insulto libero: http://forum.html.it/forum/showthread.php?s=&postid=12524872#post12524872

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    oronze hai dimenticato a dire che le stringhe non si confrontano per == ma per equals.

    Tutti gli oggetti implementano il metodo equals, che nella forma base non fa altro che

    oggetto == other

    confrontando i riferimenti degli oggetti. In questo caso se riferimenti uguali uguaglianza degli oggetti, riferimenti diversi differenza degli oggetti (anche se il contenuto è uguale).

    Nei casi in cui bisogna fare confronti è sempre meglio fare l'override almeno di equals (hashcode ci mette al sicuro se dobbiamo usarlo in strutture).

    Per le classi fornite dal JDK (in questo caso String) esiste una implementazione di equals e hashcode già pronta, dobbiamo solo ricordare che il confronto di stringhe si fa per equals (O equalsignorecase) e non per ==

  4. #4
    Utente di HTML.it L'avatar di oronze
    Registrato dal
    Jun 2001
    Messaggi
    3,543
    Originariamente inviato da valia
    oronze hai dimenticato a dire che le stringhe non si confrontano per == ma per equals.

    Tutti gli oggetti implementano il metodo equals, che nella forma base non fa altro che

    oggetto == other

    confrontando i riferimenti degli oggetti. In questo caso se riferimenti uguali uguaglianza degli oggetti, riferimenti diversi differenza degli oggetti (anche se il contenuto è uguale).

    Nei casi in cui bisogna fare confronti è sempre meglio fare l'override almeno di equals (hashcode ci mette al sicuro se dobbiamo usarlo in strutture).

    Per le classi fornite dal JDK (in questo caso String) esiste una implementazione di equals e hashcode già pronta, dobbiamo solo ricordare che il confronto di stringhe si fa per equals (O equalsignorecase) e non per ==
    hai ragionissimo...per dirla tutta, non converrebbe fare string.length() > 0?

    No ai layout tabellari!

    Insulto libero: http://forum.html.it/forum/showthread.php?s=&postid=12524872#post12524872

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Originariamente inviato da oronze
    hai ragionissimo...per dirla tutta, non converrebbe fare string.length() > 0?
    al max farei
    codice:
    if (string != null && string.trim().length > 0) {
      //STRINGA VALIDA
    }
    ma fare

    codice:
    if (string != null && !string.trim().equals("")) {
      //STRINGA VALIDA
    }
    ha lo stesso result, può cambiare il carico di risorse impiegate (non più di tanto direi e non l'ho mai misurato)

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.