JavascriptProva

mercoledì 29 marzo 2017

Esercizi di estrazione casuale di una lista senza ripetizioni

Deve essere estratto dal database un numero di records pari a un numero già concordato e salvato in memoria.
La sequenza è:
  • prima recuperare dalla memoria il numero di immagini da recuperare;
  • il database può essere di dimensioni superiori, uguali o inferiori a quel numero. Nel caso sia di dimensioni uguali o superiori non ci sono problemi, mentre se è più piccolo è necessario ridimensionare il numero di immagini da recuperare.
  • fatto questo, si crea un ArrayList delle dimensioni del cursor.
  • Ora bisogna mettere tutti i record del cursor nell'ArrayList... o procedere in un altro modo.
Io ho messo tutti i numeri ordinali dei record da 0 a size-1.
Estraggo a sorte uno di questi items dell'arrayList e quindi mi sposto nella posizione del record che ha per numero ordinale il numero estratto, lavorandoci. Nel frattempo elimino l'item estratto dall'arrayList.

Sarà utile che mi eserciti un po' nel creare un cursor e fare l'estrazione mediante ArrayList senza ripetizioni.
Allestisco una prova di laboratorio.
public class MainActivity extends AppCompatActivity {

    ArrayList<String> lista;
    int index;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        lista=new ArrayList<String>();

        lista.add("Gongolo");
        lista.add("Mammolo");
        lista.add("Pisolo");
        lista.add("Eolo");
        lista.add("Cucciolo");
        lista.add("Brontolo");
        lista.add("Dotto");

        Random rnd=new Random();
        while(lista.size()!=0) {
            index = rnd.nextInt(lista.size());
            System.out.println(lista.get(index));
            lista.remove(index);
        }
    }
}
E adesso lo faccio "correre":
03-28 20:25:26.780 3456-3456/? I/System.out: Pisolo
03-28 20:25:26.780 3456-3456/? I/System.out: Brontolo
03-28 20:25:26.780 3456-3456/? I/System.out: Eolo
03-28 20:25:26.780 3456-3456/? I/System.out: Mammolo
03-28 20:25:26.780 3456-3456/? I/System.out: Cucciolo
03-28 20:25:26.780 3456-3456/? I/System.out: Dotto
03-28 20:25:26.780 3456-3456/? I/System.out: Gongolo
Faccio tante ripetizioni per verificare l'estrazione casuale:
03-28 20:32:32.265 3543-3543/? I/System.out: Gongolo
03-28 20:32:32.265 3543-3543/? I/System.out: Eolo
03-28 20:32:32.265 3543-3543/? I/System.out: Pisolo
03-28 20:32:32.265 3543-3543/? I/System.out: Cucciolo
03-28 20:32:32.265 3543-3543/? I/System.out: Dotto
03-28 20:32:32.265 3543-3543/? I/System.out: Mammolo
03-28 20:32:32.265 3543-3543/? I/System.out: Brontolo
03-28 20:34:23.649 3616-3616/? I/System.out: Gongolo
03-28 20:34:23.649 3616-3616/? I/System.out: Brontolo
03-28 20:34:23.649 3616-3616/? I/System.out: Pisolo
03-28 20:34:23.649 3616-3616/? I/System.out: Eolo
03-28 20:34:23.649 3616-3616/? I/System.out: Dotto
03-28 20:34:23.649 3616-3616/? I/System.out: Cucciolo
03-28 20:34:23.650 3616-3616/? I/System.out: Mammolo
03-28 20:37:46.942 3749-3749/? I/System.out: Gongolo
03-28 20:37:46.942 3749-3749/? I/System.out: Mammolo
03-28 20:37:46.942 3749-3749/? I/System.out: Dotto
03-28 20:37:46.942 3749-3749/? I/System.out: Brontolo
03-28 20:37:46.942 3749-3749/? I/System.out: Pisolo
03-28 20:37:46.942 3749-3749/? I/System.out: Eolo
03-28 20:37:46.942 3749-3749/? I/System.out: Cucciolo

Sì, ho trovato un buon modo di estrarre a sorte uno per volta dei valori.

Ora lo faccio usando come elementi dell'ArrayList dei numeri.
public class MainActivity extends AppCompatActivity {

    ArrayList<Integer> lista;
    int index;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        lista=new ArrayList<Integer>();

        for(int i=0;i<10;i++){
            lista.add(i);
        }


        Random rnd=new Random();
        while(lista.size()!=0) {
            index = rnd.nextInt(lista.size());
            System.out.println(lista.get(index));
            lista.remove(index);
        }
    }
} 
03-28 21:29:46.359 3973-3973/? I/System.out: 0
03-28 21:29:46.359 3973-3973/? I/System.out: 9
03-28 21:29:46.359 3973-3973/? I/System.out: 5
03-28 21:29:46.359 3973-3973/? I/System.out: 4
03-28 21:29:46.359 3973-3973/? I/System.out: 7
03-28 21:29:46.359 3973-3973/? I/System.out: 2
03-28 21:29:46.359 3973-3973/? I/System.out: 8
03-28 21:29:46.359 3973-3973/? I/System.out: 6
03-28 21:29:46.359 3973-3973/? I/System.out: 1
03-28 21:29:46.359 3973-3973/? I/System.out: 3
03-28 21:30:25.504 4025-4025/? I/System.out: 9
03-28 21:30:25.504 4025-4025/? I/System.out: 6
03-28 21:30:25.505 4025-4025/? I/System.out: 5
03-28 21:30:25.505 4025-4025/? I/System.out: 0
03-28 21:30:25.505 4025-4025/? I/System.out: 3
03-28 21:30:25.505 4025-4025/? I/System.out: 2
03-28 21:30:25.505 4025-4025/? I/System.out: 4
03-28 21:30:25.505 4025-4025/? I/System.out: 1
03-28 21:30:25.505 4025-4025/? I/System.out: 7
03-28 21:30:25.505 4025-4025/? I/System.out: 8
03-28 21:31:10.420 4078-4078/? I/System.out: 2
03-28 21:31:10.420 4078-4078/? I/System.out: 3
03-28 21:31:10.420 4078-4078/? I/System.out: 7
03-28 21:31:10.420 4078-4078/? I/System.out: 0
03-28 21:31:10.420 4078-4078/? I/System.out: 4
03-28 21:31:10.420 4078-4078/? I/System.out: 8
03-28 21:31:10.420 4078-4078/? I/System.out: 1
03-28 21:31:10.420 4078-4078/? I/System.out: 9
03-28 21:31:10.420 4078-4078/? I/System.out: 5
03-28 21:31:10.420 4078-4078/? I/System.out: 6
Sì, funziona anche questo.