Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755

    problema con ripetizioni in array

    Il mio intento è quello di riempire un array di interi,di dimensione 10,di valori compresi tra 1 e 20(estremi inclusi) ma senza che vi siano ripetizioni.
    A tale proposito avevo fatto questo metodo che però a quanto pare nn funziona correttamente,ottengo comunque ripetizioni,ecco il metodo:
    codice:
    //all'interno di una classe
    private static int [] cv=new int [10];
    public static int [] riempiArray(){
    		int n=0;
    		boolean cè;
    		for(int i=0;i<cv.length;i++){
    			cè=true;
    			while(cè){
    				n=r.nextInt(21);
    				if(n!=0){
    					cè=ricercaOrdinata(cv,n);
    				}
    			}
    			cv[i]=n;
    		}
    		Arrays.sort(cv);
    		return cv;
    	}
    
    //eccovi anche il metodo "ricerca ordinata":
    public static boolean ricercaOrdinata(int[] dati, int chiave) {
    		int i;
    		boolean trovato = false;
    		boolean finito = false;
    		i = 0;
    		while (!trovato && !finito && i<dati.length) {
    			if (dati[i]==chiave)
    			trovato = true;
    			else if (dati[i]>chiave)
    			finito = true;
    			i++;
    		}
    		return trovato;
    	}
    perchè non funziona?perchè mi dà comunque ripetizioni?come andrebbe corretto?
    Grazie!

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Puoi utilizzare binarySearch() per sapere se il valore è presente, oppure utilizzare un TreeSet per essere certo di avere gli elementi in ordine e di non avere ripetizioni.

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: problema con ripetizioni in array

    Originariamente inviato da zipangulu
    Il mio intento è quello di riempire un array di interi,di dimensione 10,di valori compresi tra 1 e 20(estremi inclusi) ma senza che vi siano ripetizioni.
    Una soluzione semplice? Avere un array che inizialmente contiene la sequenza lineare 1....20. Poi inizi ad estrarre a sorte tra questi. Man mano che estrai un elemento riduci la dimensione "logica" di questa, chiamiamola lista in generale, facendo anche in modo da riempire il "buco" rimasto prendendo l'ultimo elemento fisico.

    Niente collezioni, niente sort, niente binary-search.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    grazie andbin!ci avevo già pensato a questo procedimento ma poi non so perchè non l'ho realizzato!
    comunque ho creato una lista con i numeri da 1 a 20 ho fatto scegliere per dieci volte un numero casuale da 1 alla lunghezza della lista e ogni volta estratto il numero per evitare ripetizioni ho rimosso il numero nella posizione sorteggiata...
    grazie ancora!

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da zipangulu
    ogni volta estratto il numero per evitare ripetizioni ho rimosso il numero nella posizione sorteggiata...
    Più che rimuovere sarebbe meglio rimpiazzarlo con l'ultimo numero "logico" disponibile e ridurre la dimensione "logica".

    1 2 3 4 5

    Inizialmente estraggo random tra 0 e 4, esce 2 (indice 2 = valore 3).

    1 2 5 4 5

    che l'ultimo 5 resti fisicamente nell'array conta poco. Conta avere una variabile che tiene la dimensione "logica", che ora diventa 4.

    Quindi estraggo random tra 0 e 3.

    ecc....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    potresti anche fare così

    codice:
    import java.util.Random;
    /**
     * Progetto d'esempio sulla generazione di numeri casuali e loro, se ripetuti, eventuale sostituzione.
     * @author Naruto 92
     */
    public class Example
    {
        private int vett[]=new int[10];
        /**
         * Carico il vettore di numeri casuali tra 1 e 20
         */
        public void caricaNumeri(){
            Random rnd=new Random();
            for(int i=0; i<vett.length; i++){
                vett[i]=rnd.nextInt(20)+1;
            }
        }
        /**
         * Elimino eventuali ripetizioni sostituendole con nuovi numeri
         */
        public void aggiusta(){
            Random rnd=new Random();
            int cont=0;
            for(int i=0; i<vett.length-1; i++){
                for(int j=i+1; j<vett.length; j++){
                    if(vett[i]==vett[j]){
                        vett[j]=rnd.nextInt(20)+1;
                    }else{
                        cont++;
                    }
                }
            }
            cont-=35;
            if(cont<vett.length){
                aggiusta();
            }
        }
        /**
         * Stampo il vettore
         */
        public void stampa(){
            for(int i=0; i<vett.length; i++){
                System.out.print(vett[i] + "\t");
            }
            System.out.println("\n");
        }
        /**
         * Avvio del programma
         * @param argv vettore di stringhe passato in automatico dall'OS
         */
        public static void main(String argv[]){
            Example e=new Example();
            e.caricaNumeri();
            e.stampa();
            e.aggiusta();
            e.stampa();
        }
    }

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.