Cartella ordinata

di il
14 risposte

Cartella ordinata

Buon pomeriggio signori. sono nuovamente io
come saprete mi sto cimentando nella creazione del gioco della tombola. al momento sto provvedendo alla creazione della cartella, che deve rispettare le seguenti specifiche:
-5 numeri per riga, appartenenti a decine diverse (1-9, 10-19 ..... 80-90), in ordine crescente (quindi su una riga ci potrà essere qualcosa tipo 5, 15, 29, 49, 77)
-se nelle righe 2 e 3 viene generato un numero appartenente alla stessa decina di una riga precedente (es. se nella riga 1 c'è 15 e mi viene un random per generare un nuovo numero sulla stessa decina, il numero generato dovrà essere > di 15)
dovrei aver elencato tutte le restrizioni mmh
comunque per fare questa cosa ho prodotto questo codice

public Integer[][] generaMatriceCartella()
	{
		Integer cartella[][] = new Integer[3][9];
		for (int i = 0; i < 3; i++)
		{
			for (int k = 0; k < 5; k++)
			{
				if (i == 0)
				{
					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 if (index == 8)
					cartella[i][index] = rnd.nextInt(11) + (index*10);
					else
					cartella[i][index] = rnd.nextInt(10) + (index*10);
				}
				else if (i == 1)
				{
					int index = rnd.nextInt(9);
					while (cartella[i][index] != null)
					index = rnd.nextInt(9);
					if (cartella[0][index] != null)
					{
						if (index == 0)
						while (cartella[i][index] <= cartella[0][index])
						cartella[i][index] = rnd.nextInt(9)+1;
						else if (index == 8)
						while (cartella[i][index] <= cartella[0][index])
						cartella[i][index] = rnd.nextInt(11) + (index*10);
						else
						while (cartella[i][index] <= cartella[0][index])
						cartella[i][index] = rnd.nextInt(10) + (index*10);
					}
					else if (i == 2)
					{
						int index = rnd.nextInt(9);
						while (cartella[i][index] != null)
						index = rnd.nextInt(9);
						if (cartella[0][index] != null || cartella[1][index] != null)
						{
							if (index == 0)
							while (cartella[i][index] <= cartella[0][index] || cartella[i][index] <= cartella[1][index])
							cartella[i][index] = rnd.nextInt(9)+1;
							else if (index == 8)
							while (cartella[i][index] <= cartella[0][index] || cartella[i][index] <= cartella[1][index])
							cartella[i][index] = rnd.nextInt(11) + (index*10);
							else
							while (cartella[i][index] <= cartella[0][index] || cartella[i][index] <= cartella[1][index])
							cartella[i][index] = rnd.nextInt(10) + (index*10);
						}
					}
				}
			}
		}
		return cartella;
	}
	
che però non ne vuole sapere di ordinarmi correttamente i numeri, se per esempio nella prima riga ho un 77, e dopo mi dovesse venir generato nuovamente un numero nella decina del 7, mi va a creare numeri minori. come mai? un'idea penso di averla, e ora la provo, ma intanto vorrei sentire la vostra opinione, anche nel caso ci fosse un modo per avere un codice più compatto

14 Risposte

  • Re: Cartella ordinata

    Non ci posso credere...
    è letteralmente 1h che modifico e compilo il file, ed è letteralmente 1h che fa solo finta di compilare. non ho parole.
    mi sapete spiegare perché spesso io compilo un file, il cmd si comporta come se lo avesse compilato, ma in realtà non fa nulla?
  • Re: Cartella ordinata

    KuroKami69 ha scritto:


    deve rispettare le seguenti specifiche:
    -5 numeri per riga, appartenenti a decine diverse (1-9, 10-19 ..... 80-90), in ordine crescente (quindi su una riga ci potrà essere qualcosa tipo 5, 15, 29, 49, 77)
    -se nelle righe 2 e 3 viene generato un numero appartenente alla stessa decina di una riga precedente (es. se nella riga 1 c'è 15 e mi viene un random per generare un nuovo numero sulla stessa decina, il numero generato dovrà essere > di 15)
    dovrei aver elencato tutte le restrizioni mmh
    Io ne aggiungerei una:
    - che in ogni colonna ci sia almeno un numero.

    KuroKami69 ha scritto:


    comunque per fare questa cosa ho prodotto questo codice
    Che detto onestamente è prolisso ma soprattutto ben poco comprensibile. Ci si "perde" solo tra i vari if / while.
  • Re: Cartella ordinata

    Si ho notato, per questo ho trovato una soluzione alternativa:
    1) vengono scelte random 15 celle della matrice
    2) vengono generati i numeri inerenti le decine
    3) vengono ordinati con un sort sulle colonne.
    questo mi dovrebbe permettere di avere un codice più pulito e adattabile.
    al mio precedente script mancano un paio di cose, quindi ho preferito pensarla in un altro modo
  • Re: Cartella ordinata

    Domandina:
    come posso ordinare una matrice avente sia Integer che null?
    mi spiego meglio. la matrice della mia schedina, dove non contiene valori, va a null. questo però mi impedisce di fare il classico sort confrontando 2 valori con gli operatori < e >. c'è quindi un modo?
  • Re: Cartella ordinata

    KuroKami69 ha scritto:


    Domandina:
    come posso ordinare una matrice avente sia Integer che null?
    mi spiego meglio. la matrice della mia schedina, dove non contiene valori, va a null. questo però mi impedisce di fare il classico sort confrontando 2 valori con gli operatori < e >. c'è quindi un modo?
    C'è una questione: fare ordinamenti su liste di OGGETTI in cui ci sono dei null è perfettamente possibile (chiaramente il criterio di comparazione va codificato appropriatamente). Ma generalmente si deve stabilire se un null deve venire prima o dopo un non-null.

    E' così nel tuo caso .... o vuoi semplicemente "saltare" i null lasciandoli dove sono?? Perché se (come presumo) in quest'ultimo caso, è un criterio MOLTO particolare che va codificato con un apposito algoritmo di ordinamento (cioè non puoi usare Collections.sort).
  • Re: Cartella ordinata

    Esatto, i null devono restare dove sono, perché indicano le celle vuote.
    domandina leggermente ot rispetto a quello che ho chiesto ora. esiste un metodo più semplice e veloce per creare una cartella? rispettando tutte le restrizioni. cioè io ho pensato a questi 2 modi ma mi sembrano troppo lunghi a livello di codice
    (ho usato l'array valore per evitarmi i doppioni)
    
    	public Integer[][] generaMatriceCartella()
    	{
    		Integer cartella[][] = new Integer[3][9];
    		
    		//con questi for scelgo QUALI caselle andranno riempite
    		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);
    				cartella[i][index] = 1;
    			}
    		}
    		
    		int valori[] = new int[15]; //array di appoggio per non avere doppioni
    		int z = 0;
    		//con questi for invece popoliamo la cartella con numeri casuali NON ordinati
    		for (int i = 0; i < 3; i++)
    		{
    			for (int k = 0; k < 9; k++)
    			{
    				if (cartella[i][k] != null)
    				{
    					if (k == 0)
    					{
    						cartella[i][k] = rnd.nextInt(9)+1;
    						for (int j = 0; j < valori.length; j++)
    						{
    							while (valori[j] == cartella[i][k])
    							cartella[i][k] = rnd.nextInt(9)+1;
    						}
    						valori[z] = cartella[i][k];
    						z++;
    					}
    					else if (k == 8)
    					{
    						cartella[i][k] = k*10 + rnd.nextInt(11);
    						for (int j = 0; j < valori.length; j++)
    						{
    							while (valori[j] == cartella[i][k])
    							cartella[i][k] = k*10 + rnd.nextInt(11);
    						}
    						valori[z] = cartella[i][k];
    						z++;
    					}
    					else
    					{
    						cartella[i][k] = k*10 + rnd.nextInt(10);
    						for (int j = 0; j < valori.length; j++)
    						{
    							while (valori[j] == cartella[i][k])
    							cartella[i][k] = k*10 + rnd.nextInt(10);
    						}
    						valori[z] = cartella[i][k];
    						z++;
    					}
    				}
    			}
    		}
    		return cartella;
    	}
    	
    EDIT: ok come non detto, al solito quando compilo, fa solo finta di compilare...
    dicevamo, come dovrei fare per ordinare quindi degli Integer lasciando i null dove sono?
    EDIT2:
    ho modificato il codice nel tag code con quello attuale
  • Re: Cartella ordinata

    KuroKami69 ha scritto:


    dicevamo, come dovrei fare per ordinare quindi degli Integer lasciando i null dove sono?
    Detto sempre onestamente, secondo me ti stai complicando la vita. Io ad esempio ci ho ragionato un po' su queste cartelle ed ho pensato un algoritmo che non è difficile e che al massimo richiede un ordinamento ma senza null in mezzo ai piedi.
  • Re: Cartella ordinata

    Si, lo avevo pensato anche io con gli 0, ma, un giorno dovrò lavorare anche con i null e dovrò saperli gestire anche in un ordinamento (forse). vorrei quindi fare tutta questa serie di "esperienze" ora che sono in un ambito davvero libero e non restrittivo, piuttosto che farlo da solo senza una consegna, o peggio ancora sul posto di lavoro un giorno.
    se potessi dirmi come potrei fare un ordinamento con in mezzo i null te ne sarei grato
    (la tua soluzione probabilmente è identica a questa che sto adottando io solo che al posto dei null ci son 0, mi sbaglio?)
  • Re: Cartella ordinata

    KuroKami69 ha scritto:


    se potessi dirmi come potrei fare un ordinamento con in mezzo i null te ne sarei grato
    Devi implementare tu un algoritmo di ordinamento, es un Bubble-Sort facendo le considerazioni per "saltare" i null.

    KuroKami69 ha scritto:


    (la tua soluzione probabilmente è identica a questa che sto adottando io solo che al posto dei null ci son 0, mi sbaglio?)
    No. E l'algoritmo che ho pensato io credo quasi sicuramente non è uno che hai pensato tu.
  • Re: Cartella ordinata

    Ah ho capito, quindi sarà una bella sfida mmh
    te come avresti fatto?
  • Re: Cartella ordinata

    
    Integer tmp;
    		for (int i = 0; i < 9; i++)
    		{
    			System.out.println(i);
    			if ((cartella[0][i] != null && cartella[1][i] != null) || (cartella[0][i] != null && cartella[2][i] != null) || (cartella[1][i] != null && cartella[2][i] != null) || (cartella[0][i] != null && cartella[1][i] != null && cartella[2][i] != null))
    			{
    				if (cartella[0][i] == null)
    				{
    					if (cartella[1][i] > cartella[2][i])
    					{
    						tmp = cartella[1][i];
    						cartella[1][i] = cartella[2][i];
    						cartella[2][i] = tmp;
    					}
    				}
    				else if (cartella[1][i] == null)
    				{
    					if (cartella[0][i] > cartella[2][i])
    					{
    						tmp = cartella[0][i];
    						cartella[0][i] = cartella[2][i];
    						cartella[2][i] = tmp;
    					}
    				}
    				else if (cartella[2][0] == null)
    				{
    					if (cartella[0][i] > cartella[1][i])
    					{
    						tmp = cartella[0][i];
    						cartella[0][i] = cartella[1][i];
    						cartella[1][i] = tmp;
    					}
    				}
    				else
    				{
    					for (int j = 0; j < 3; j++)
    					{
    						for (int k = 0; k < 1; k++)
    						{
    							System.out.println("k = " + k);
    							if (cartella[k][i] > cartella[k+1][i])
    							{
    								tmp = cartella[k][i];
    								cartella[k][i] = cartella[k+1][i];
    								cartella[k+1][i] = tmp;
    							}
    						}
    					}
    				}
    			}
    		}
    questo è quello che mi è uscito. credo di aver compreso tutte le soluzioni. il primo if semplicemente lascia come sono le colonne che non hanno o han un solo elemento.
    poi ho messo i 3 casi in cui c'è solo una casella a null, ma nemmeno questo funziona, non so perché onestamente, non lo capisco.
    poi l'else è il caso in cui ci sono tutte e 3 le caselle occupate. a livello logico mi pare abbastanza semplice, ho solo 3 caselle per cui confronto prima primo e secondo, se il primo è maggiore, swappo. poi confronto il secondo con il terzo, se il secondo è maggiore swappo. passo una seconda volta e rifaccio il controllo. poi basta no? quindi cosa diamine sbaglio? tra l'altro una volta mi ha dato pure l'eccezione del null pointer, non capisco perché. mha
    EDIT: ho capito il primo errore fatto, ho cambiato il codice nel tag code, con quello nuovo, ma comunque continuo a non capire perché non mi funziona il sort. potreste aiutarmi a capirlo per favore?
  • Re: Cartella ordinata

    Ok io non capisco.
    la mia matrice, cartella[3][9], ha le righe con indice 0, 1, 2. e le colonne con indice 0, 1, 2, 3, 4, 5, 6, 7, 8. fin qua non credo di sbagliare.
    ora, come si nota dal codice nel messaggio precedente, alla fine ho un else con un for per ordinare i 3 valori di una colonna.
    ora, la mia condizione di entrata nel blocco del sort è che ci siano 1 o 0 caselle a null.
    ho quindi detto cosa fare qualora la prima, la seconda o la terza cella siano a null. questo dovrebbe implicare che un semplice else abbia implita l'istruzione "se nessuna cella è null".
    forse sbaglio io, forse non ho considerato qualcosa (sono abbastanza irritato perché ho speso 2 giorni a dannarmi per capire perché non funzionava il sort e il problema era semplicemente che avevo scritto uno 0 al posto della i, sulle colonne), ma perché
    else
    non funziona e
    else if (cartella[0][i] != null && cartella[1][i] != null && cartella[2][i] != null)
    funziona?
    EDIT: vabbeh ci rinuncio a capire come lavorano i file del jdk. ora che ho commentato la parte dell'if, dopo l'else, e cancellato e ricompilato i file (per 2 volte) funziona comunque... ho formattato qualche giorno fa, quindi dubito sia un problema di Windows (7)... no non ho ancora intenzione di usare netbeans
  • Re: Cartella ordinata

    Ciao,
    scusa l'intrusione ma ho visto qualche tuo post su questo argomento e non mi posso esimere.
    Stai creando una cartella per la tombola con una funzione che sembra scritta in C Language per un PC MS-Dos. È un vecchio modo di programmare che non andrebbe applicato a Java che ha le sue regole e convenzioni. Oltretutto, con tutte quelle nidificazioni, il codice è difficilmente leggibile e mantenibile.
    Per esempio, non capisco perchè devi mettere le caselle vuote a "null". Null non è un valore, se proprio non vuoi lasciarle a 0, potresti pensare ad un valore più confrontabile, tipo -1.
    Dici che non vuoi usare lo zero perché un giorno potresti ritrovarti a doverlo gestire: io penso che, a meno che tu non abbia a casa un vecchio XT, presto ti troverai a gestire problemi insormontabili per l'impostazione che hai dato al programma. Pensa solo se dovessi visualizzare immagini .jpg invece che le scarne cifre...
    In ultimo ti dò un consiglio (per quello che vale ed oltre a quello di studiare un po':) ): tendenzialmente, noi umani vediamo le cose sotto forma di matrice, ma per il computer non è così. In Internet trovi facilmente delle soluzioni ad un problema classico denominato "delle 8 regine". Se ci dai un'occhiata, scoprirai che quasi tutti i programmatori non impostano la scacchiera come una matrice 8x8, ma come una Collection di 64 oggetti. Al computer non cambia nulla se invece che valutare qualcosa tipo casella[linea][colonna] < casella [linea+1][colonna] deve valutare qualcosa come casella(posizione) < casella(posizione + 10).

    Buon proseguimento.
    Mauro
  • Re: Cartella ordinata

    Ciao mauro, ti ringrazio per quanto hai scritto.
    è solo un esercizio per scuola, e il fatto di aver voluto usare un Integer per poter avere i null, è solo un capriccio personale. inoltre ho detto che volevo usarlo, perché un giorno dovrò sicuramente avere a che fare con i null, ed è bene che impari a gestirmeli sotto tutti i punti di vista. anche se non credo ci sia poi molto di più da fare.
    non sono un programmatore esperto, anzi, quindi è abbastanza normale se agli inizi non sembra nemmeno qualcosa fatto in java. però io imparo semplicemente provando e riprovando, quindi anche se ora il codice che scrivo non è a chissà quale livello, nel prossimo esercizio terrò sicuramente in considerazione quanto hai detto per migliorarmi un pochettino di più, anche se al momento mi sfugge quale sia la giusta ottica di programmazione di un programmatore java.
    secondo quando detto da te, io dovrei avere una collezione di 27 celle, ma a quel punto, almeno dal mio punto di vista inesperto, avrei avuto problemi sia a creare i valori sia a riordinarli. questo vale per me. sono sicuro che voi sappiate fare la stessa cosa che ho fatto io in un miliardesimo del tempo che ci ho messo io e infinitamente meglio anche
Devi accedere o registrarti per scrivere nel forum
14 risposte