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.
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: GongoloFaccio 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: 6Sì, funziona anche questo.