Della ha scritto:
Ciao, provo ad aiutarti ma non sono sicuro di aver ben compreso il tuo codice.
Se ho ben capito tu hai un file contenente un certo numero di vecchie estrazioni del lotto e vuoi tirare fuori tutti gli ambi che sono usciti con una certa frequenza. E' corretto?
Comunque, in generale gli errori più evidenti che ho trovato sono i seguent:
- La tua applicazione tratta dei numeri, ma tu lavori con delle stringhe, che ti costringono a fare cose strane (vedi la logica per aggiungere lo zero) e il cui confronto è decisamente meno performante rispetto al confronto di 2 interi
- Di solito si lavora con delle liste se ti interessa mantenere un determinato ordinamento. Se ho ben capito qual è il tuo obiettivo, allora non ti serve mantenere l'ordinamento, per cui potresti lavorare con strutture dati diverse, in cui la ricerca è più performante (es: HashSet)
Allora, grazie ai consigli di una generosa persona (non se la tira come qualche sapientone), ho migliorato di molto le prestazioni con due piccole modifiche.
Lettura della lista una sola volta, prima di invocare il metodo:
//Leggo la lista una volta per tutte
List<String> listaConfronto = getListaFinale();
for (int n = 1; n <= 90; n++) {
for (int n2 = n+1; n2 <= 90; n2++) {
String ns1 = String.format("%02d", n);
String ns2 = String.format("%02d", n2);
singolaRuota(listaConfronto, ruotaScelta, ns1, ns2);
}
}
Quindi ho modificato il metodo in questo modo:
private void singolaRuota(List<String> lista, int r, String n1, String n2) {
switch (r) {
case 1: // sarà Bari
int ps = 0; // presenze
for (String s : lista) { //ciclo la lista
if((s.contains(n1) && s.contains(n2))) {
ps++; // incremento presenza
}
}
// se le presenze sono maggiori >= 3 a seconda delle mie impostazioni
if(ps > totale) {
// aggiungo alla lista temporanea l'ambo
tmp.add(n1 + "-" + n2);
tmp.add(Integer.toString(ps));
}
// itero la lista temporanea per escudere i doppioni
// quindi inserire gli ambi che mi interessano
// in una lista finale
Iterator<String> it = tmp.iterator();
while (it.hasNext()) {
String s = it.next();
if(s.equals(n1 + "-" + n2)) {
listaIterata.add(n1 + " - " + n2);
listaIterata.add(Integer.toString(ps));
it.remove();
}
}
break;
Però mi è stato anche sconsigliato, come tu stesso hai detto di utilizzare delle stringhe. Un tizio mi ha parlato di array numerici, di inserire tutto su una matrice 90x90. Ma onestamente non è stato molto chiaro quindi ho passato.
Adesso tu mi stai dicendo di utilizzare HashSet, ma i Set non accettano doppioni o sbaglio?
Mettiamo il caso di avere 25 – 74 e 25 -67, il 25 non viene scartato?
Mi potresti fare un piccolo esempio? Hai voglia? Non sono più un ragazzino quindi il tempo non è dalla mia parte.
In pratica ho dei file csv (che si trovano nella memoria del dispositivo) da cui leggo i dati.
1) L’utente seleziona il periodo e la ruota
2) Leggo i dati e popolo una lista provvisoria
3) Ciclo i 90 numeri a coppie (n1, n2)
4) All’interno del metodo, in base al numero delle estrazioni, ho una variabile totale il cui valore cambia da 3 a 9.
5) Quando un ambo è >= a totale, la variabile presenze += 1 e aggiungo l’ambo ad una lista tmp.
6) Itero la lista tmp per eliminare i doppioni (es: 33 – 44, 44 – 33), e inserisco questi ambi all’interno di una lista definitiva.
7) Passo il tutto ad una classe Adapter per popolare una ListView.
E questo è tutto.
Cronometrando il tempo, risulta che per popolare la lista definitiva (passo 6) trascorrono per smartphone con API 19 (KitKat) fino a 4 secondi, prima di questa variazione ne trascorrevano anche 17. Quindi per me è già un’ottima cosa, se però mi suggerite un metodo alternativo, io ascolto volentieri, e ringrazio per la pazienza.
migliorabile ha scritto:
E' ovvio che SE il tuo dato e' numerico e ci devi fare confronti e op matematiche, usare delle stringhe e' quantomento inefficiente. Diciamo pure sciocco.
SE ti serve avere una collezione di oggetti e controllare se dentro questa collezione c'e' uno specifico oggetto, la LISTA (in cui la ricerca e' sequenziale) NON E' ASSOLUTAMENTE la struttura ideale.
Ti serve un SET, una struttura dati PENSATA appositamente per questo tipo di op.
ESATTAMENTEcquanto ha scritto @della
Questi problemi sono legati ad un errore concettuale di fondo:
NON SI STUDIA spulciando Internet, ma SUI LIBRI.
Ho letto libri e svolto corsi online, ma c’è tanta roba da imparare, e questo dovresti saperlo Mr. Ingegnere. Tra l’altro, tempo fa ho anche seguito alcune lezioni online (insomma faccio quel che posso “permettermi”) di alcune università (ma non spiegano nulla di veramente utile). Ad ogni modo se personalmente decido di dare un contributo (aiutare qualcuno) lo faccio perché ne ho voglia, non per mania di egocentrismo, tanto meno ridicolizzo la persona a cui lo dedico. Poi tutta sta confidenza, ma chi ti conosce?
Guarda che non hai a che fare con un ragazzino, quindi stai rilassato, nessuno ti obbliga a far nulla.