Problema metodo java

Pubblicità

xveilsidex

Utente Attivo
Messaggi
230
Reazioni
7
Punteggio
38
Ciao a tutti qualcuno potrebbe darmi una mano per la creazione di questo metodo java ?
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 PROVATO IN QUESTA MANIERA NON NON FUNZIONA
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;
    }
 
Ho fatto le seguenti assunzioni, visto che non hai specificato molti dettagli del problema:
  • str è un array della classe di cui fa parte il metodo che hai richiesto; gli elementi di questo array sono oggetti con due campi: un identificatore intero e una stringa;
  • quando tale array viene creato, ogni posizione viene inizializzata a null;
  • gli elementi vengono inseriti nella prima posizione libera disponibile;
  • l'array è "diviso" in due parti: nella prima ci sono gli elementi inseriti, nella seconda le posizioni libere; ossia, non esistono posizioni vuote tra due elementi inseriti.

Sotto queste ipotesi, il metodo è il seguente:

Codice:
public int add(int id, String word) {
    /* Controllo che l'id sia positivo */
    if(id <= 0)
	return ID_NOT_VALID;
    /* Controllo che word non sia la stringa nulla.
     *   Se con nulla intendevi vuota, sostituisci la condizione
     *   con word.equals("")
     */
    if(word == null)
	return KO_NULL_STRING;
    for(int i = 0; i < str.length; i++) {
	/* Se la posizione contiene null, allora posso inserire */
	if(str[i] == null) {
	    str[i] = new StringUtils(id, word);
	    return SUCCESS;
	}
	/* Se non è null, controllo se l'id in posizione i è uguale a
	 *   quello passato come parametro
	 */
	if(str[i].getID() == id)
	    return KO_DUPLICATE_FOUND;
    }
    /* Se sono arrivato alla fine del for, tutte le posizioni sono diverse
     *   da null, ossia l'array è pieno
     */
    return KO_FULL_POOL;
}

Se hai dei dubbi chiedi pure :)
 
Ciao sei stato molto gentile a rispondere! Allore le assunzioni che hai fatto sono tutte corrette e mi scuso se ho omesso alcune dettagli del problema anzi sei stato bravo a trarle da solo ! Cmq l'ultima ipotesi che hai fatto non è proprio corretta in quanto hai ragione a dire che l'array è stato "suddiviso" in due parti però ho fatto cosi solo per provare il codice che ho scritto. Alla luce di questo è possibile che tra due posizioni "piene" ci sia una vuota! Con quest'ultima considerazione se c'è da apportare qualche modifica al codice potresti modificarlo per favore ? ti ringrazio! :)
 
Allora si potrebbe fare in questo modo: tenere un riferimento alla prima posizione non null del vettore in cui inserire e scorrerlo tutto comunque, per verificare che eventuali posizioni successive non contengano elementi con id pari a quello ricercato.

Codice:
public int add(int id, String word) {
    int pos = -1;
    /* Controllo che l'id sia positivo */
    if(id <= 0)
	return ID_NOT_VALID;
    /* Controllo che word non sia la stringa nulla.
     *   Se con nulla intendevi vuota, sostituisci la condizione
     *   con word.equals("")
     */
    if(word == null)
	return KO_NULL_STRING;
    for(int i = 0; i < str.length; i++) {
	/* Se è la prima posizione null che trovo, mi salvo l'indice */
	if(str[i] == null && pos == -1)
               pos = i;
	/* Se non è null, controllo se l'id in posizione i è uguale a
	 *   quello passato come parametro
	 */
	else if(str[i] != null && str[i].getID() == id)
	    return KO_DUPLICATE_FOUND;
    }
    /* Se pos != -1 posso inserire, altrimenti l'array è pieno */
    if(pos != -1) {
        str[pos] = new StringUtils(id, word);
        return SUCCESS;
    }
    return KO_FULL_POOL;
}
 
Davvero grazie mille MrStorm ora funziona correttamente il metodo! cmq ti vorrei chiedere una cosa mi sapresti dire perchè questo metodo non mi restituisce l'elemento ricercato pur avendolo inserito correttamente, nè il valore null se non trova nulla ? Ad esempio se inserisco 76 dovrebbe restituirmi A invence non mi restituisce nulla !
Codice:
//nel main
        StringUtils[] str = new StringUtils[5];
        str[0] = new StringUtils(76,"A");
        str[1] = new StringUtils(20,"B");
        str[2] = new StringUtils(21,"C");
        str[3] = new StringUtils(55,"D");
        str[4] = new StringUtils(18,"D");

StringUtils prova = new StringUtils(str);
        prova.ricerca(76);

//nella classe
 public String ricercaSequenziale(int key) {
 String b = "null";
     for (int i=0; i<str.length; i++)
          if (str[i].getID() ==key)
              return str[i].getNomeID();
     return b; //restituisce b sse non trova l'elemento da cercare
 }
Devo per forza implementarla in questo modo ?
Codice:
         public void ricerca(int key) {
             int k = str.length;
             for (int i=0; i<str.length; i++){
                  if (str[i].getID()==key){
                     System.out.println(str[i].getNomeID());
                      break;
                         }else {
                              System.out.println("NULL");
                             break;
                  }
               }
             }
 
Anche la prima ricerca sequenziale che hai scritto è corretta, semplicemente devi usare il valore di ritorno della funzione in qualche modo :)
Ad esempio, se prova è il nome dell'oggetto su cui invocare il metodo della ricerca, per stampare a video il risultato devi invocare eseguire l'istruzione System.out.println(prova.ricercaSequenziale(76));
Più che altro, c'è una cosa che non capisco; StringUtils è la classe che modella gli oggetti che inserisci nell'array (le coppie id, word), giusto? Allora non capisco il senso di questa istruzione: StringUtils prova = new StringUtils(str);
prova dovrebbe essere un oggetto della classe in cui hai definito i metodi add e ricercaSequenziale, che ha come attributo il vettore nel quale sarà eseguito l'inserimento / ricerca :)
 
Dunque io
1)creo un vettore di oggetti della classe StringUtils di nome "str" con questa istruzione StringUtils[] str = new StringUtils[n-elementi];

2)successivamente inserisco per ogni n-esimo str della class StringUtils i valori in questo modo :
str[0] = new StringUtils(0,"A");
str[1] = new StringUtils(1,"B");

ecc...

3)per poter cerca un elemento con public void ricerca(int key) in maniera "globale" creo un altro oggetto della classe StringUtils che contiene tutti gli elementi che ho creato prima in questo modo :
StringUtils prova = new StringUtils(str);
dopo posso cercare un elemento tra quelli creati :
prova.ricerca(300);

I costruttori della classe StringUtils sono :
Codice:
public class StringUtils {
    private static 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;
    }

// metodi 
........................

//campi di esemplare
private  int identifier;
 private  String nomeid;
Se puoi suggerirmi una soluzione migliore ben venga perchè fino ad ora ho usato questa che a mio parere si adattava meglio al mio caso! Tu come avresti fatto? :)
 
Pubblicità
Pubblicità
Indietro
Top