Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    Problema in Java

    Salve a tutti, ho un problema con Java.
    Supponiamo di avere un certo alfabeto ordinato, ad esempio l'alfabeto latino con 26 simboli in ordine alfabetico. Io in pratica voglio creare un array di 26^n oggetti di tipo StringBuffer ordinato con l'ordinamento lessicografico che contenga tutte le possibili combinazioni di questi 26 simboli; ho provato a scrivere un programma ma mi solleva l'eccezione java.lang.ArrayIndexOutOfBoundsException.

    La classe che si occupa di creare la lista è questa:
    codice:
     public static StringBuffer[] creaTabellaTotale(int n, char[] a) {   
        
     
        	 StringBuffer[] tabella = new StringBuffer[ pow(26, n)];
        	 for(int w =0; w < pow(26, n); w++)
        		 tabella[w] = new StringBuffer("");
        	 
        	 for(int h = 1; h <= n ; h++){
        		for(int u =0; u < pow ( 26, h-1); u++){
        			
        		for (int j = 0; j<26; j++){
        			
        			for( int x =pow(26, n-h+1)*u + pow(26, n-h)*j; x< pow(26, n-h+1)*u + pow(26, n-h)*(j+1); x++)
        				tabella[x] = tabella[x].append(a[j]);
        		}
        			
        		}
        		
        	 }
        	 
        	 return tabella;
         }
    Nel codice a[] è l'array che contiene i 26 caratteri dell'alfabeto in ordine alfabetico. La funzione pow() l'ho ridefinita in modo che accetti 2 interi e restituisca un intero. Volevo capire se il problema è in questa classe oppure è scritta bene.
    Probabilmente ho fatto confusione con gli indici ma non riesco a trovare l'errore.

  2. #2

    Moderazione

    Benvenuto sul forum! Ti ricordo che:
    • il titolo della discussione deve contenere una breve ma significativa descrizione del problema;
    • le discussioni relative a Java non sono trattate qui, ma nell'apposita sottosezione;
    • il codice va specificato tra tag [CODE] ... [/CODE], altrimenti perde l'indentazione.


    Ora correggo io e provvedo a spostare il thread, in futuro imposta correttamente la discussione fin da subito; nel frattempo ti consiglio di dare un'occhiata al regolamento.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Va bene , grazie

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    A quale riga viene lanciata l'eccezione?Leggi lo stackTrace lanciato in console e indicaci la riga..


  5. #5
    In realtà mi indica una riga secondo me "strana", nel senso che non capisco cosa centrino gli array in quella riga. Comunque il fatto è che per scrivere il programma intero ho usato delle classi scritte apposta per il libro che sto studiando, e a riportare tutto quanto la faccenda diventerebbe troppo lunga; vorrei semplicemente sapere se la classe che ho riportato è scritta bene.

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    non avendo una sfera di cristallo, non possiamo aiutarti se non fornisci dettagli completi. Certo che salta subito all'occhio quella funzione pow che usi tranquillamente negli indici dei vettori (l'ho "riscritta" per essere sicuri che ritorni un int) ed ho scritto una mini-classe (quello che hai postato tu è un metodo, non una classe), per provare il tuo metodo. Ho solo aggiunto un po' di graffe
    codice:
    package html.exercise;
    
    /**
     *
     * @author Andrea
     */
    public class Esercizio52 {
        
        public static int pow (int b, int e) {
            return (int)Math.pow(b, e);                
        }
        
        public static StringBuffer[] creaTabellaTotale(int n, char[] a) {    
     
        	 StringBuffer[] tabella = new StringBuffer[ pow(26, n)];
        	 for(int w =0; w < pow(26, n); w++) {
                 tabella[w] = new StringBuffer("");
             }
             
        	 for(int h = 1; h <= n ; h++){
                 for(int u =0; u < pow ( 26, h-1); u++) {     
        		for (int j = 0; j<26; j++) {    			
        			for( int x =pow(26, n-h+1)*u + pow(26, n-h)*j; x< pow(26, n-h+1)*u + pow(26, n-h)*(j+1); x++) {
        				tabella[x] = tabella[x].append(a[j]);
                            }
                    }
                 }    		
        	 }    	 
        	 return tabella;
         }
        
        public static void main (String[] args) {
            char[] a = new char[] {
                'a', 'b', 'c', 'd', 'e', 'f', 'g', 
                'h', 'i', 'j', 'k', 'l', 'm', 'n',
                'o', 'p', 'q', 'r', 's', 't', 'u',
                'v', 'w', 'x', 'y', 'z'
                
            };
            StringBuffer[] tabella = creaTabellaTotale(3, a);
            for (StringBuffer buf : tabella) {
                System.out.println(buf);
            }
        }
        
    }
    brutto ma funziona. Certo si potrebbe migliorare (per esemopio: se passi un array di char che in qualche modo rappresentano il tuo alfabeto, perché passare la lunghezza dell'alfabeto? Passa solo l'array di char e la lunghezza dell'alfabeto è già determinata).

    Occhio agli OutOfMemoryError... con uno Heap "standard" (non ho modificato il mio), esci già con un errore per n = 5
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  7. #7
    A quanto pare allora il problema non era in questo metodo; sì forse è un problema di heap. Grazie !

  8. #8

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.