Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2013
    Messaggi
    13

    [java] evitare errore OutOfBoundException

    Buongiorno,
    Sto eseguendo un normalissimo esercizio utilizzando un metodo ricorsivo per calcolare quante volte compare true in un array di boolean partendo da una precisa posizione.
    Questo è uno dei tanti esercizi dove ho sempre lo stesso errore di lunghezza dell'array. Qualcuno sa come evitare questo problema?
    Grazie mille!

    codice:
    class U {
        public static void main(String[] args) {
            boolean a[] = {true,true,false,true,false,true,true,true,true};
            int x;
            System.out.println("Inserisci x");
            x = Leggi.unInt();
            int n = quantiTrue(a,x);
            System.out.println("Ci sono "+n+" elementi TRUE");
        }
        
        static int quantiTrue(boolean a[], int x) {
            int h = 0;
            if(x <= a.length) {
                if(a[x] == true) {
                    h = h+1;
                }
            }
            quantiTrue(a,x+1);
            return h;
        }
    }

  2. #2
    Ciao

    ci sono un paio di errori logici nel codice.
    Primo errore:
    if(x <= a.length) {
    dovrebbe essere
    if(x < a.length) {
    perché gli array iniziano da 0 e arrivano al n. elementi - 1

    Secondo: ogni volta che chiami quantiTrue, setti h nuovamente a 0.

    Prova così:
    codice:
    class U {
        
        private static int h = 0;
        
        public static void main(String[] args) {
            
            boolean a[] = {true,true,false,true,false,true,true,true,true};
            int x;
            System.out.println("Inserisci x");
            x = 0;
            int n = quantiTrue(a,x);
            System.out.println("Ci sono "+n+" elementi TRUE");
        }
        
        
        static int quantiTrue(boolean a[], int x) {
            
            if(x < a.length) {
                if(a[x] == true) {
                    h = h+1;
                }
                 quantiTrue(a,x+1);
            }
            
            return h;
        }
    }
    Un saluto

    Eugenio

  3. #3
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Ma x a cosa ti serve? Non dovrebbe partire sempre da zero?

    Il problema comunque è qua:

    if(x <= a.length)

    Se l'array è lungo 10 gli indici vanno da 0 a 9. Con questo condizione prendi anche l'indice 10 (11esimo elemento, che non esiste.)

    Alcuni suggerimenti:

    a[x] è già un booleano: scrivere if (a[x]) {} è la stessa cosa di if (a[x] == true) {}

    h = h + 1; lo puoi scrivere in maniera compatta come h++;

    edit

    E occhio alla ricorsione, mi sa che va in loop infinito ^^'
    Ultima modifica di Alex'87; 15-12-2013 a 12:47
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  4. #4
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Quote Originariamente inviata da iugin1974 Visualizza il messaggio

    Secondo: ogni volta che chiami quantiTrue, setti h nuovamente a 0.

    Prova così:
    codice:
    class U {
        
        private static int h = 0;
        
        public static void main(String[] args) {
            
            boolean a[] = {true,true,false,true,false,true,true,true,true};
            int x;
            System.out.println("Inserisci x");
            x = 0;
            int n = quantiTrue(a,x);
            System.out.println("Ci sono "+n+" elementi TRUE");
        }
        
        
        static int quantiTrue(boolean a[], int x) {
            
            if(x < a.length) {
                if(a[x] == true) {
                    h = h+1;
                }
                 quantiTrue(a,x+1);
            }
            
            return h;
        }
    }
    Un saluto

    Eugenio
    Mettere una variabile "globale" non è una buona pratica, soprattutto quando si può risolvere in maniera decisamente migliore:

    codice:
    private static int countTrue(boolean[] array, int currentIndex)
    {
        int trueFound = 0;
    
        if ( currentIndex < array.length )
        {
            if ( array[currentIndex] )
            {
                trueFound++;
            }
    
            trueFound += countTrue(array, currentIndex + 1);
        }
    
        return trueFound;
    }
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  5. #5
    Mettere una variabile "globale" non è una buona pratica, soprattutto quando si può risolvere in maniera decisamente migliore:
    Ahimé devo darti ragione... Chiedo scusa per l'imprecisione....

    Ciao

    Eugenio

  6. #6
    Utente di HTML.it
    Registrato dal
    Nov 2013
    Messaggi
    13
    Grazie mille! ora provo

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2013
    Messaggi
    13
    codice:
    	static int quantiTrue(boolean a[], int x) {		int h = 0;
    		if(x < a.length) {
    			if(a[x]) {
    				h=+1;
    			}System.out.println(h);
    			h =+ quantiTrue(a,x+1);
    			
    		}
    		return h;
    	}
    }
    ho provato ma il risultato da sempre 0, ho inserito una stampa del contatore e da 1, quindi si azzera ogni volta. ora ci ragiono su

  8. #8
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    h=+1;

    Cosa credi che faccia?
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  9. #9
    Utente di HTML.it
    Registrato dal
    Nov 2013
    Messaggi
    13
    giusto giusto! grazie mille per l'aiuto!

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.