Assegnazione

di il
13 risposte

Assegnazione

Ok, c'è una cosa che non riesco in alcun modo a capire, quindi chiedo lumi a voi
(parlando sempre della tombola) <- casting della discussione a tombola
ho la classe cartella che ha come attributo solo un array

Integer cartella[][] = new Integer[3][9];
poi ho fatto una classe GeneraComponenti che ha un metodo "generaCartella" che mi popola un array

public void generaCartella()
	{
		for (int i = 0; i < 3; i++)
		{
			for (int k = 0; k < 5; k++)
			{
				int index = rnd.nextInt(9);
				while (cartella[i][index] != null)
				index = rnd.nextInt(9);
				if (index == 0)
				cartella[i][index] = rnd.nextInt(9)+1;
				else
				cartella[i][index] = rnd.nextInt(10) + (index*10);
			}
		}
	}
dato che sono uno zuccone la mia domanda è:
se si trattasse di una variabile, sarebbe alquanto semplice, metto un return e nella classe cartella faccio, per esempio

casella = generaCasella();
(ovviamente ho un attimo adattato), ma per le matrici il discorso com'è? metto come return integer e dopo faccio

cartella[3][9] = generaCartella();
(sempre nella classe cartella)?
più generalmente quindi se ho un metodo, in una classe, che mi genera il contenuto di una matrice/array, come assegno tale contenuto alla matrice/array di un'altra classe?

13 Risposte

  • Re: Assegnazione

    KuroKami69 ha scritto:


    ma per le matrici il discorso com'è? metto come return integer e dopo faccio
    
    cartella[3][9] = generaCartella();
    
    No, così non ha senso.

    Avrebbe invece senso:
    public Integer[][] generaMatriceCartella() {
        Integer[][] cartella = new Integer[3][9];
        // ......
        return cartella;
    }
    Ma ad ogni modo, il codice che hai fatto nel tuo generaCartella() è comunque fumoso, poco efficiente e non mi pare nemmeno che stai facendo una corretta estrazione di valori tra 1 e 90 !

    In una cartella ci sono generalmente 3 righe. In ciascuna di queste righe ci sono al massimo 5 valori casuali che sono disposti in modo progressivo. Lo hai considerato??
  • Re: Assegnazione

    Si, se vuoi provare il codice, ti garantisco che funziona al 100% ^_^
    genera 5 numeri per riga, li mette nella casella delle apposite decine e mette null in tutte le altre.
    non ho ben capito il tuo discorso. nella classe generacomponenti io devo fare quel generaMatriceCartella?

    @EDIT:
    ok ho capito, ma questa cosa che hai fatto te come si chiama? voglio dire è cos'è?
  • Re: Assegnazione

    KuroKami69 ha scritto:


    non ho ben capito il tuo discorso. nella classe generacomponenti io devo fare quel generaMatriceCartella?
    Vuol dire che andrebbe architettato tutto un pochino meglio. Con 6 cartelle hai tutti i 90 numeri perfettamente distribuiti (3 x 5 x 6 = 90). Quindi ogni 6 cartelle hai bisogno di un generatore di numeri casuali "unici" tra 1 e 90.

    Estrai a caso 5 valori, li ORDINI e li distribuisci su una riga.
    Estrai a caso 5 valori, li ORDINI e li distribuisci su un'altra riga.
    ecc...
  • Re: Assegnazione

    Piccolo OT
    da che ho avuto modo di guardare, tutte le cartelle della tombola sono composte nel seguente modo:
    ogni riga è composta di 9 caselle aventi come range i seguenti valori:
    1-9, 10-19, 20-29, 30-39, 40-49, 50-59, 60-69, 70-79, 80-90.
    0, 1, 2, 3, 4, 5, 6, 7, 8
    le mie 2 righe di codice fanno esattamente questo (anche se probabilmente ho cannato il 90, ma lo sistemo in 2 secondi)
    
    for (int i = 0; i < 3; i++)
    {
    	for (int k = 0; k < 5; k++)
    	{
    		int index = rnd.nextInt(9); //genera un numero da 0 a 8, che sarà l'indice per le colonne della mia matrice
    		while (cartella[i][index] != null) //fino a quando alla riga i, colonna index c'è già un valore
    		index = rnd.nextInt(9); //mi generi nuovamente un valore da usare come index
    		if (index == 0) //se il numero generato è 0 allora mi serve un range di valori da 1 a 9, quindi 
    		cartella[i][index] = rnd.nextInt(9)+1; //0-8+1
    		else
    		cartella[i][index] = rnd.nextInt(10) + (index*10); //qua invece mi prende l'index, che equivale alla decina, lo moltiplica per 10, e fa un nuovo random da 0 a 9, in questo modo ottendo, per esempio: index = 5, 5*10 = 50+0-9 = perfettamente perinente con le regole. ora piazzo la regoletta per far uscire anche il 90
    	}
    }
    
  • Re: Assegnazione

    KuroKami69 ha scritto:


    Piccolo OT
    da che ho avuto modo di guardare, tutte le cartelle della tombola sono composte nel seguente modo:
    ogni riga è composta di 9 caselle aventi come range i seguenti valori:
    1-9, 10-19, 20-29, 30-39, 40-49, 50-59, 60-69, 70-79, 80-90.
    0, 1, 2, 3, 4, 5, 6, 7, 8
    Non so dove hai guardato ma gli esempi che ho visto io sono es.
    +--+--+--+--+--+--+--+--+--+
    |  |11|  |34|  |58|  |73|80|
    +--+--+--+--+--+--+--+--+--+
    | 3|  |28|  |49|  |64|  |88|
    +--+--+--+--+--+--+--+--+--+
    |  |17|  |38|  |59|69|78|  |
    +--+--+--+--+--+--+--+--+--+
    Quindi la cosa sicura è: all'interno di una riga i numeri sono in progressione ordinata.

    EDIT:
    in effetti, guardando altri esempi, noto anche io che c'è una "settorizzazione" dei valori. Ovvero es. il 34 sta sempre nella 4° colonna.

    Quindi sì una separazione 1-9 | 10-19 | 20-29 | 30-39 | 40-49 | 50-59 | 60-69 | 70-79 | 80-90
    è corretta.
  • Re: Assegnazione

    andbin ha scritto:


    KuroKami69 ha scritto:


    Piccolo OT
    da che ho avuto modo di guardare, tutte le cartelle della tombola sono composte nel seguente modo:
    ogni riga è composta di 9 caselle aventi come range i seguenti valori:
    1-9, 10-19, 20-29, 30-39, 40-49, 50-59, 60-69, 70-79, 80-90.
    0, 1, 2, 3, 4, 5, 6, 7, 8
    Non so dove hai guardato ma gli esempi che ho visto io sono es.
    +--+--+--+--+--+--+--+--+--+
    |  |11|  |34|  |58|  |73|80|
    +--+--+--+--+--+--+--+--+--+
    | 3|  |28|  |49|  |64|  |88|
    +--+--+--+--+--+--+--+--+--+
    |  |17|  |38|  |59|69|78|  |
    +--+--+--+--+--+--+--+--+--+
    Quindi la cosa sicura è: all'interno di una riga i numeri sono in progressione ordinata.
    esatto, quello che ho scritto io, prima riga i range dei valori, seconda riga l'indice della colonna della matrice, e onestamente non riesco a immaginare come possa far uscire tutti e 90 i numeri con 6 cartelle, visto che è tutto casuale, basato sulla singola riga
  • Re: Assegnazione

    KuroKami69 ha scritto:


    non riesco a immaginare come possa far uscire tutti e 90 i numeri con 6 cartelle, visto che è tutto casuale, basato sulla singola riga
    Io l'ho dedotto dalla spiegazione su Wikipedia in Fogli di schede


    P.S. ho editato il mio messaggio precedente con altri riscontri che ho fatto nel frattempo.
  • Re: Assegnazione

    Il problema è che da quanto ho capito di quel capitoletto su Wikipedia, quel pezzo è per il tabellone.
    il tabellone, ok deve avere tutti e 90 i numeri in ordine sequenziale, ma (si ho visto che hai editato) ogni casella su ogni riga è "settorizzata", ossia avrà solo ed esclusivamente un range di valori e non potrà avere valori esterni, ultima colonna esclusa che contiene anche il 90.
    quindi alla fine convieni con me che quelle 2 righe di codice che ho buttato giù io funzionano a dovere per questo problema?
    (e chiudiamo l'OT su com'è strutturata fisicamente una tombola)
    mi spiegheresti concretamente cos'è quel metodo che hai scritto te prima? sostanzialmente hai reso come metodo la dichiarazione di una matrice di integer?
  • Re: Assegnazione

    KuroKami69 ha scritto:


    mi spiegheresti concretamente cos'è quel metodo che hai scritto te prima? sostanzialmente hai reso come metodo la dichiarazione di una matrice di integer?
    E' perfettamente lecito restituire una matrice (o un array di qualsiasi dimensioni) da un metodo in java. Non sei limitato ai tipi primitivi o a void, puoi restituire oggetti, array, liste, mappe etc. ...
  • Re: Assegnazione

    KuroKami69 ha scritto:


    mi spiegheresti concretamente cos'è quel metodo che hai scritto te prima? sostanzialmente hai reso come metodo la dichiarazione di una matrice di integer?
    Gli array sono OGGETTI. Con new Integer[3][9] crei un array di lunghezza 3 di cui ottieni il reference. Questo array contiene riferimenti ad altri 3 array di lunghezza 9. In Java gli array multi-dimensionali sono strutturalmente "array di array".
    E quindi poi puoi restituire tale reference.
  • Re: Assegnazione

    Si, questo lo avevo intuito, ma quello che hai fatto te, quella struttura che mi hai mostrato, ha un nome per caso?
  • Re: Assegnazione

    KuroKami69 ha scritto:


    ma quello che hai fatto te, quella struttura che mi hai mostrato, ha un nome per caso?
    Ma di che struttura parli?? Di quel metodo mostrato da me?
    È un normalissimo metodo, che ha come tipo di ritorno Integer[][] (che è un tipo "reference" concettualmente come String, Long, Date, ecc..).
    All'interno creo un oggetto di QUELLO stesso tipo cioè Integer[][] e pertanto lo posso lecitamente far restituire come valore di ritorno.

    Nessun "nome".
  • Re: Assegnazione

    Ah allora avevo capito bene. all'inizio pensavo una cosa inverosimile come il fatto che rendevi la matrice un metodo. ma di fatto hai creato un metodo che restituisce una matrice. avevo un po' le idee confuse, grazie
Devi accedere o registrarti per scrivere nel forum
13 risposte