|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: May 2009
Messaggi: 147
|
[Java] Generare array con numeri non duplicati!
Salve a tutti!! Ho realizzato questo codice in java e vorrei sapere se c'è un metodo per evitare quel do-while orrendo in quanto si blocca sempre al momento dell'esecuzione! Come posso fare in base a questo codice ad evitare di stampare interi duplicati? Grazie!!!
Codice:
int max = 20;
int[] ris = new int[10];
int error=0;
int temp=0;
// devo stampare 11 array random di 10 interi!
for(int i=0; i<11; i++){
for (int k=0; k<ris.length; k++){
\**Questo dovrebbe eliminare i duplicati ma il programma è come se va in loop e si blocca!
**/
/** Blocco in loop **/
do{
temp = (int) (max*Math.random())+1;
for(int j=0; j<k; j++){
if(ris[j]==temp){
error=1;
}
}
}while(error==1); //esegue il do finchè error=1
ris[k]=temp;
System.out.print(ris[k]+" ");
/** Blocco in loop **/
Spero possiate aiutarmi!! sto diventando matto!! Grazie!! Ultima modifica di ozzy19 : 09-02-2010 alle 18:21. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 13052
|
Non puoi usare un HashSet? O devi implementare te l'eliminazione dei duplicati?
|
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Oct 2002
Messaggi: 133
|
mmh, ma ti sei scordato un pezzo di codice?
La condizione per impostare error = 1 non e' mai vera, perche' dentro ris non hai scritto nulla, quindi alluppa Saluto |
|
|
|
|
|
#4 | |
|
Member
Iscritto dal: May 2009
Messaggi: 147
|
Quote:
Comunque lo posso fare sia in un modo che nell'altro!! come funziona HashSet? non sono pratico in java!! |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
Qualche giorno fa un amico mi ha chiesto di aiutarlo su un esercizio scolastico penso identico al tuo, e glielo avevo fatto così
Codice:
package provanico;
import java.util.Random;
public class ProvaNico
{
public static void main(String[] args)
{
int[] interiDiversi = new int[10];
Random rand = new Random();
int i = 0;
while(i < interiDiversi.length)
{
int interoCasuale = 1 + rand.nextInt(20);
boolean contiene = false;
for(int j = 0; j < i && !contiene; j++)
{
if(interoCasuale == interiDiversi[j])
contiene = true;
}
if(!contiene)
interiDiversi[i++] = interoCasuale;
}
for(Integer j : interiDiversi)
System.out.println(j);
}
}
Ultima modifica di ndakota : 09-02-2010 alle 20:26. |
|
|
|
|
|
#6 |
|
Member
Iscritto dal: May 2009
Messaggi: 147
|
Grazie mille proprio quello che mi serviva!!!
Un ultima cosa!! senti ma se a questo codice voglio aggiungere un ciclo for per stamparmi 11 array diversi di questo tipo come faccio? ad esempio nel codice mio iniziale avevo questo for Codice:
for(int i=0; i<11; i++){
|
|
|
|
|
|
#7 | |
|
Member
Iscritto dal: Oct 2002
Messaggi: 133
|
Quote:
Comunque hashset e' una implementazione di set. Non permette elementi duplicati. Quindi un: while(set.size() != 10) set.add(random) dovrebbe risolvere i tuoi problemi Ancora saluto |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
Scusa non riesco a capire cosa intendi
|
|
|
|
|
|
#9 |
|
Member
Iscritto dal: May 2009
Messaggi: 147
|
Ciao! scusami!! e più precisamente dove dovrei inserire
Codice:
while(set.size() != 10) set.add(random) Codice:
int max = 20;
int[] ris = new int[10];
int error=0;
int temp=0;
// devo stampare 11 array random di 10 interi!
for(int i=0; i<11; i++){
for (int k=0; k<ris.length; k++){
\**Questo dovrebbe eliminare i duplicati ma il programma è come se va in loop e si blocca!
**/
/** Blocco in loop **/
do{
temp = (int) (max*Math.random())+1;
for(int j=0; j<k; j++){
if(ris[j]==temp){
error=1;
}
}
}while(error==1); //esegue il do finchè error=1
ris[k]=temp;
System.out.print(ris[k]+" ");
/** Blocco in loop **/
|
|
|
|
|
|
#10 | |
|
Member
Iscritto dal: May 2009
Messaggi: 147
|
Quote:
Codice:
11 14 9 10 8 20 8 3 7 13 15 13 5 18 20 9 1 19 8 1 12 9 12 9 16 7 2 13 17 3 18 17 1 14 14 10 1 4 13 20 7 15 1 20 9 5 19 8 3 4 12 12 18 7 4 20 18 9 20 16 19 7 12 14 7 14 7 13 2 16 1 8 17 10 17 10 19 7 6 3 10 16 8 1 16 2 20 9 8 9 18 4 2 8 15 8 4 6 16 12 20 20 2 1 20 2 9 9 12 2 come noti al primo array ci sono due 8! bene io voglio che siano tutti diversi! |
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: May 2001
Messaggi: 13052
|
Un HashSet ti permette di avere una collezione che non contiene elementi duplicati, esattamente la definizione di insieme comunemente adottata in matematica.
In pratica puoi risolvere così: Codice:
HashSet<Integer> set = new HashSet();
Random rnd = new Random();
int max = 20;
while (set.size() < 10) {
Codice:
[0, 17, 18, 4, 5, 9, 10, 11, 13, 14] |
|
|
|
|
|
#12 | |
|
Member
Iscritto dal: Oct 2002
Messaggi: 133
|
Quote:
Se devi solo stampare i numeri e non ti servono gli array per farci altro puoi fare cosi Codice:
Set set;
for (int i = 0; i < 11; i++){
set = new HashSet(0)
System.out.println("Array numero " + i");
while(set.size() < 10){
int rnd = Math.random() * 100
set.add(rnd);
System.out.println(rnd);
}
}
Edit: quello di warduck e' molto piu' bello :/ |
|
|
|
|
|
|
#13 |
|
Member
Iscritto dal: May 2009
Messaggi: 147
|
perfetto!! problema risolto!! C'è qualche metodo nell'Hashset che permette di ordinarli in maniera cresente gli elementi?
|
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
Ho capito, ti bastava aggiungere un for esterno al mio programma
Codice:
package provanico;
import java.util.Random;
public class ProvaNico
{
public static void main(String[] args)
{
for(int k = 0; k < 11; k++)
{
int[] interiDiversi = new int[10];
Random rand = new Random();
int i = 0;
while(i < interiDiversi.length)
{
int interoCasuale = 1 + rand.nextInt(10);
boolean contiene = false;
for(int j = 0; j < i && !contiene; j++)
{
if(interoCasuale == interiDiversi[j])
contiene = true;
}
if(!contiene)
interiDiversi[i++] = interoCasuale;
}
for(Integer j : interiDiversi)
System.out.print(j + " ");
System.out.println();
}
}
}
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
|
|
|
|
|
|
#16 |
|
Member
Iscritto dal: Oct 2002
Messaggi: 133
|
|
|
|
|
|
|
#17 |
|
Member
Iscritto dal: May 2009
Messaggi: 147
|
Ok davvero grazie di cuore!!! Finalmente ci ho capito qualcosa!!! grazie davvero a tutti coloro che mi hanno risposto e saputo aiutare: Gold, ndakota, WarDuck
Alla prossima!!! |
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 1945
|
Posso darti un altro modo io!
Se hai un range massimo, ad esempio vuoi n numeri casuali e il massimo è m puoi fare in questo modo! Codice:
private static ArrayList<Integer> lista = crea();
private static ArrayList<Integer> crea(){
ArrayList<Integer> tmp = new ArrayList<Integer>();
for(int i = 0; i<=m; i++)tmp.add(i);
return tmp;
}
public static int[] getArray(int n){
ArrayList<Integer> tmp = (ArrayList)lista.clone();
int array[] = new int[n];
for(int i = 0; i<array.length; i++)
array[i] = tmp.remove(new Random().nexInt(tmp.size()));
}
|
|
|
|
|
|
#19 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
NON SI RISOLVONO ESERCIZI SCOLASTICI PER INTERO, COME LO DEVO DIRE ?
PS: è maiuscola perché sto urlando Ultima modifica di cionci : 10-02-2010 alle 09:27. |
|
|
|
|
|
#20 |
|
Member
Iscritto dal: May 2009
Messaggi: 147
|
Salve! non sono esercizi scolastici, ma volevo solo crearmi un programmino di estrazioni casuali(Win4Life, infatti gli array sono composti da 10 elementi composti da numeri casuali da 1 a 20!), 11 array perchè se non erro (statistica) sono minimo 11 sistemi che bisogna realizzare per vincere almeno un premio base!!
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:04.




















