Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Antigravity A1: drone futuristico per riprese a 360° in 8K con qualche lacuna da colmare
Antigravity A1: drone futuristico per riprese a 360° in 8K con qualche lacuna da colmare
Abbiamo messo alla prova il drone Antigravity A1 capace di riprese in 8K a 360° che permette un reframe in post-produzione ad eliche ferme. Il concetto è molto valido, permette al pilota di concentrarsi sul volo e le manovre in tutta sicurezza e decidere con tutta tranquillità come gestire le riprese. La qualità dei video, tuttavia, ha bisogno di uno step in più per essere competitiva
Sony Alpha 7 V, anteprima e novità della nuova 30fps, che tende la mano anche ai creator
Sony Alpha 7 V, anteprima e novità della nuova 30fps, che tende la mano anche ai creator
Dopo oltre 4 anni si rinnova la serie Sony Alpha 7 con la quinta generazione, che porta in dote veramente tante novità a partire dai 30fps e dal nuovo sensore partially stacked da 33Mpixel. L'abbiamo provata per un breve periodo, ecco come è andata dopo averla messa alle strette.
realme GT 8 Pro Dream Edition: prestazioni da flagship e anima racing da F1
realme GT 8 Pro Dream Edition: prestazioni da flagship e anima racing da F1
realme e Aston Martin Aramco F1 Team si sono (ri)unite dando alla vita un flagship con chip Snapdragon 8 Elite Gen 5 e design esclusivo ispirato alle monoposto di Formula 1. La Dream Edition introduce la nuova colorazione Lime Essence abbinata al tradizionale Aston Martin Racing Green, decorazioni intercambiabili personalizzate e una confezione a tema F1, intorno a uno smartphone dall'ottima dotazione tecnica con batteria da 7000mAh ricaricabile a 120W e isola fotografica intercambiabile
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 16-02-2009, 11:21   #1
giogts
Senior Member
 
L'Avatar di giogts
 
Iscritto dal: Sep 2001
Città: (Potenza)
Messaggi: 4660
[JAVA]Aiuto! ArrayList in restituzione di una ricerca?

Premetto che sono agli inizi con java,
Per una applicazione (raccolta punti promossa da un’azienda)dovrei svolgere questo caso d'uso:
l’applicazione cerca i premi con il maggior numero di richieste;
Per fare questo, ho scritto il seguente metodo:
Codice:
public ArrayList<Premio> cercaPremiPiuRichiesti() {
        assert (elencoPremi.size() != 0) : "Attenzione! Non ci sono premi!";
        ArrayList<Premio> risultato = new ArrayList<Premio>();        
        for (int i = 0; i < elencoPremi.size()-1; i++) {
            Premio premio = this.getPremio(i);
            Premio premioSuccessivo = this.getPremio(i+1);
            if (premio.getRichieste() > premioSuccessivo.getRichieste()) {
                risultato.add(premio);
            }
        }
        return risultato;
    }
Ora il problema è che mi restituisce la lista risultato che ha sempre e solo un oggetto, il primo che trova nel confronto; quando in realtà dovrebbero essere due o più i premi che hanno il numero di richieste più alte, per esempio due premi hanno 8 richieste, e che quindi dovrebbero finire nella lista!
Non so se sono riuscito a spiegarmi bene, ma praticamente non riesco a farmi restituire da un confronto(l'if) una lista di oggetti, dove sto sbagliando?

Vi metto anche il metodo (del controllo) che stampa il risultato:
Codice:
private void schermoCercaPremiPiuRichiesti(Collezione collezione) {
        System.out.println("---------------------------------");
        System.out.println("   Ricerca Premi più richiesti   ");
	System.out.println("---------------------------------");
        ArrayList<Premio> risultato = collezione.cercaPremiPiuRichiesti();
         System.out.println("Risultato della ricerca: ");
        for (Premio premio : risultato) {
            System.out.println(premio);
        }
}
__________________
AMD A10 6700 || dissi Mugen3 || Asrock a88 fm2+ || Ram:2x4GB G.Skill 2133 || Samsung 840 evo 128GB || Asus 24' Led || Case CM N300 || Notebook: Santech v3510 (t9500-4GB-hd:100GB@7200rpm-8600GT-3dmark05:6900)|| Non fate affari con gli utenti Spytek e betick!!!

Ultima modifica di giogts : 16-02-2009 alle 11:24.
giogts è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2009, 14:24   #2
Morfeo XP
Senior Member
 
L'Avatar di Morfeo XP
 
Iscritto dal: Sep 2002
Messaggi: 409
L'algoritmo con il quale fai la ricerca dei premi più richiesti non è corretto.
Innanzitutto dovresti stabilire il numero di premi più richiesti che il metodo deve restituire o in alternativa i premi con più di n richieste. Ad esempio i 3 premi più richiesti o i premi con più di 100 richieste.
__________________
Sony Vaio FE11M | EeePC 901 Linux | Intel C2D E6750 | Asus P5K-E WiFi/AP | Corsair XMS2 PC 6400 2x1GB | Hitachi 7K250 80GB Sata | Hitachi 7K250 80GB Sata | Seagate 7200.10 500GB Sata | LiteOn Combo 5232K | Nec ND-3500 | GeForce 8400GS | Monitor LG L204WT| Creative Inspire 5.1 Digital 5500 | Logitech Cordless Desktop MX | Mouse MX700 | LinkSys WAG54G | Canon IP4000 | Dell X50v | Nikon Coolpix 3100 | FujiFilm FinePix S5600 | Sony Alpha 300 18-70
Morfeo XP è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2009, 15:24   #3
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
E in ogni caso nella libreria del JDK c'è una interfaccia che si chiama Comparable (c'è anche Comparator): implementandola ti semplificheresti non poco il lavoro di riordino di una collezione di oggetti delle stesso tipo secondo un criterio da te definito.

Ad esempio:
- devo ordinare una collezione di oggetti Premio
- il criterio di ordinamento tra gli oggetti Premio è per numero di richieste, in ordine discendente.

Implemento nella mia classe Premio l'interfaccia Comparable
Codice:
public class Premio implements Comparable
{
   // membri di istanza...

   // costruttore...

   // metodi di istanza...
  
  // implementazione metodo compareTo definito in Comparable
  // supponendo che il metodo getRichieste() torni un intero 
  public int compareTo(Premio other)
  {
       // così stabilisce un ordine ascendente
       // return  this.getRichieste() - other.getRichieste();

       // così stabilisce un ordine discendente:
       return  other.getRichieste() - this.getRichieste();
  }

}
Faccio riordinare una collezione di oggetti Premio dalla classe Collections nel JDK (java.util.Collections)
Codice:
//... ove appropriato, nell'applicazione:

// elencoPremi è un ArrayList<Premio> contenente i vari premi in ordine sparso
Collections.sort(elencoPremi);

// ora elencoPremi è ordinato secondo il criterio che abbiamo stabilito
// nell'implementazione dell'interfaccia Comparable nella classe Premio
// cioè in ordine discendente: elencoPremi.get(0) torna il Premio con maggiori richieste.
Tenendo poi conto delle indicazioni che ti ha dato Morfeo XP e supponendo si debba restituire i primi N premi con maggiori richieste:
Codice:
public ArrayList<Premio> cercaPrimiPremi(int N) 
{
    assert (elencoPremi.size() != 0) : "Attenzione! Non ci sono premi!";
    assert (N > 0 && N <= elencoPremi.size()) : "Numero premi richiesti non valido";
    
    ArrayList<Premio> primiPremi = new ArrayList<Premio>(N);        
    
    int loopCounter = 0;
    Iterator<Premio> iterator= elencoPremi.iterator();
    while(loopCounter < N  &&  iterator.hasNext())
    {
        primiPremi.add(iterator.next());
    }
    return  primiPremi;
}
Supponendo invece si debbano restituire tutti i premi che abbiano almeno N richieste o più:
Codice:
public ArrayList<Premio> cercaPremiConRichieste(int numRichieste) 
{
    assert (elencoPremi.size() != 0) : "Attenzione! Non ci sono premi!";
    assert (numRichieste > 0) : "Numero richieste specificate per i premi non valido";
    
    ArrayList<Premio> premiFiltrati = new ArrayList<Premio>();        
    
    // essendo elencoPremi gia' ordinato in ordine discendente basta
    // continuare a inserire tutti i Premi incontrati dal primo in poi fino a che
    // presentano il numero minimo di richieste desiderato 

    Iterator<Premi> iterator = elencoPremi.iterator();
    while (iterator.hasNext())
    {
        Premio candidato = iterator.next();

        if (candidato.getRichieste() < numRichieste)
        {
             break;
        }
       
        premiFiltrati.add(candidato);
    }

    return  premiFiltrati;
}
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2009, 16:18   #4
giogts
Senior Member
 
L'Avatar di giogts
 
Iscritto dal: Sep 2001
Città: (Potenza)
Messaggi: 4660
grazie 1000 ad entrambi, però io non ho bisogno di stabilire il numero di premi più richiesti che il metodo deve restituire o i premi con più di n richieste, primo perchè non è richiesto dalle specifiche, e per questo non vorrei complicarmi troppo la vita, e secondo perchè i premi li immette l'utente all'inizio, quindi il metodo non saprà mai a priori quanti premi ci sono e quanti dovranno essere inseriti nel risultato....
per questo mi sembra superfluo ordinare la lista o stabilire quanti premi dovranno essere restituiti,

vi faccio un esempio,
premio1: friggitrice, richieste 8
premio2: pirofila, richieste 7
in questo caso il metodo dovrebbe restituire un arraylist con solo un elemento, cioè la friggitrice.

premio1: friggitrice, richieste 6
premio2: pirofila, richieste 6
premio3: orologio, richieste 3
premio4: felpa, richieste 6
in questo caso il metodo dovrebbe restituire un arraylist con 3 oggetti, cioè quelli che hanno il numero più alto di richieste(che è 6)

vorrei evitare l'uso di comparatori e iteratori (prematuro per il livello dell'esercizio)
quello che mi blocca è cosa devo scrivere dentro l'if per confrontare le richieste di un premio con le richieste di un altro premio
__________________
AMD A10 6700 || dissi Mugen3 || Asrock a88 fm2+ || Ram:2x4GB G.Skill 2133 || Samsung 840 evo 128GB || Asus 24' Led || Case CM N300 || Notebook: Santech v3510 (t9500-4GB-hd:100GB@7200rpm-8600GT-3dmark05:6900)|| Non fate affari con gli utenti Spytek e betick!!!
giogts è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2009, 16:34   #5
Morfeo XP
Senior Member
 
L'Avatar di Morfeo XP
 
Iscritto dal: Sep 2002
Messaggi: 409
Cosa dovrebbe restituire in questo caso?

premio1: friggitrice, richieste 6
premio2: pirofila, richieste 4
premio3: orologio, richieste 3
premio4: felpa, richieste 5
premio5: borsone, richieste 5
__________________
Sony Vaio FE11M | EeePC 901 Linux | Intel C2D E6750 | Asus P5K-E WiFi/AP | Corsair XMS2 PC 6400 2x1GB | Hitachi 7K250 80GB Sata | Hitachi 7K250 80GB Sata | Seagate 7200.10 500GB Sata | LiteOn Combo 5232K | Nec ND-3500 | GeForce 8400GS | Monitor LG L204WT| Creative Inspire 5.1 Digital 5500 | Logitech Cordless Desktop MX | Mouse MX700 | LinkSys WAG54G | Canon IP4000 | Dell X50v | Nikon Coolpix 3100 | FujiFilm FinePix S5600 | Sony Alpha 300 18-70
Morfeo XP è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2009, 17:03   #6
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da Morfeo XP Guarda i messaggi
Cosa dovrebbe restituire in questo caso?

premio1: friggitrice, richieste 6
premio2: pirofila, richieste 4
premio3: orologio, richieste 3
premio4: felpa, richieste 5
premio5: borsone, richieste 5
Se non ho capito male dovrebbe restiuire solo un premio: friggitrice, 6, giusto?
Cioè torna sempre e solo l'istanza(o le istanze) con il valore di richieste maggiore.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2009, 17:11   #7
giogts
Senior Member
 
L'Avatar di giogts
 
Iscritto dal: Sep 2001
Città: (Potenza)
Messaggi: 4660
Quote:
Originariamente inviato da banryu79 Guarda i messaggi
Se non ho capito male dovrebbe restiuire solo un premio: friggitrice, 6, giusto?
Cioè torna sempre e solo l'istanza(o le istanze) con il valore di richieste maggiore.
esatto, solo il premio (o i premi) con il numero di richieste maggiore
__________________
AMD A10 6700 || dissi Mugen3 || Asrock a88 fm2+ || Ram:2x4GB G.Skill 2133 || Samsung 840 evo 128GB || Asus 24' Led || Case CM N300 || Notebook: Santech v3510 (t9500-4GB-hd:100GB@7200rpm-8600GT-3dmark05:6900)|| Non fate affari con gli utenti Spytek e betick!!!
giogts è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2009, 17:31   #8
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
metodo 1: con Comparable e Colloctions.sort(), come sopra, quindi iteri prendendo il maggiore (primo elemento) e continui a prendere elementi finchè quello successivo ha valore uguale a quello attuale in termini di numero richieste.

metodo 2: by hand, devi comunque ordinare, perchè non ti basta prendere un elemento il cui valore sia il maggiore ma bensì tutti gli elementi (uno o più) il cui valore sia il maggiore.
Codice:
// ordina la collezione dei premi, quindi torna la lista dei premi con il maggior
// numero di richieste:
public ArrayList<Premio> cercaPremiPiuRichiesti(ArrayList<Premio> listaPremi)
{
    assert(listaPremi.size() > 0 bla bla bla...);

    ArrayList<Premio> sortedList = mergeSort(listaPremi);
    // ora sortedList contiene i Premi ordinati per richieste, in ordine discendente.
    // chiaramente il metodo mergeSort() te lo devi implementare tu, se non ti puoi appoggiare alle classi del JDK
    
    ArrayList<Premio> result = new ArrayList<Premio>(1);
    
    int index = 0;
    int maxValue = -10000;
    while (index < sortedList.size())
    {
        Premio premio = sortedList.get(index);
        
        if (premio.getRichieste() < maxValue)
            break;

        maxValue = premio.getRichieste();
        result.add(premio);
        index++;
    }

    return result;
}
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2009, 17:38   #9
Morfeo XP
Senior Member
 
L'Avatar di Morfeo XP
 
Iscritto dal: Sep 2002
Messaggi: 409
Perfetto. Abbiam chiarito il discorso riguardante i premi con il maggior numero di richieste...

Per cercare il premio o i premi con il maggior numero di richieste potresti adottare un ArrayList ordinato, come proposto da banryu79, oppure fare una doppia scansione dell'ArrayList (non ordinato). La prima scansione per cercare il premio con la maggior richiesta e la seconda per trovare ed inserire nel ArrayList da restituire, i premi (o il premio) con la maggiore richiesta.
Ovviamente è possibile fare una sola scansione dell'ArrayList per cercare i premi con maggior richiesta, ma visto che il numero di premi sicuramente non sarà maggiore di 50, si possono adottare soluzioni non ottimali.
__________________
Sony Vaio FE11M | EeePC 901 Linux | Intel C2D E6750 | Asus P5K-E WiFi/AP | Corsair XMS2 PC 6400 2x1GB | Hitachi 7K250 80GB Sata | Hitachi 7K250 80GB Sata | Seagate 7200.10 500GB Sata | LiteOn Combo 5232K | Nec ND-3500 | GeForce 8400GS | Monitor LG L204WT| Creative Inspire 5.1 Digital 5500 | Logitech Cordless Desktop MX | Mouse MX700 | LinkSys WAG54G | Canon IP4000 | Dell X50v | Nikon Coolpix 3100 | FujiFilm FinePix S5600 | Sony Alpha 300 18-70
Morfeo XP è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2009, 17:50   #10
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da Morfeo XP Guarda i messaggi
... visto che il numero di premi sicuramente non sarà maggiore di 50...
E questo dove sta scritto? Cioè, io non lo sapevo
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2009, 17:52   #11
Morfeo XP
Senior Member
 
L'Avatar di Morfeo XP
 
Iscritto dal: Sep 2002
Messaggi: 409
E' solo una mia supposizione...
__________________
Sony Vaio FE11M | EeePC 901 Linux | Intel C2D E6750 | Asus P5K-E WiFi/AP | Corsair XMS2 PC 6400 2x1GB | Hitachi 7K250 80GB Sata | Hitachi 7K250 80GB Sata | Seagate 7200.10 500GB Sata | LiteOn Combo 5232K | Nec ND-3500 | GeForce 8400GS | Monitor LG L204WT| Creative Inspire 5.1 Digital 5500 | Logitech Cordless Desktop MX | Mouse MX700 | LinkSys WAG54G | Canon IP4000 | Dell X50v | Nikon Coolpix 3100 | FujiFilm FinePix S5600 | Sony Alpha 300 18-70
Morfeo XP è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2009, 17:54   #12
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da Morfeo XP Guarda i messaggi
E' solo una mia supposizione...
Ah, beh, sono rimasto spiazzato dalla parola "sicuramente"... Alla faccia della supposizione
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 16-02-2009, 18:39   #13
giogts
Senior Member
 
L'Avatar di giogts
 
Iscritto dal: Sep 2001
Città: (Potenza)
Messaggi: 4660
grazie proverò in entrambi i modi, poi vi faccio sapere quale scelgo
__________________
AMD A10 6700 || dissi Mugen3 || Asrock a88 fm2+ || Ram:2x4GB G.Skill 2133 || Samsung 840 evo 128GB || Asus 24' Led || Case CM N300 || Notebook: Santech v3510 (t9500-4GB-hd:100GB@7200rpm-8600GT-3dmark05:6900)|| Non fate affari con gli utenti Spytek e betick!!!
giogts è offline   Rispondi citando il messaggio o parte di esso
Old 18-02-2009, 13:01   #14
giogts
Senior Member
 
L'Avatar di giogts
 
Iscritto dal: Sep 2001
Città: (Potenza)
Messaggi: 4660
rieccomi, ho deciso di utilizzare i due cicli per le due scansioni dell'ArrayList, in modo da non utilizzare cose non ancora studiate, e che quindi non dovrei usare, praticamente ho fatto così:
Codice:
public ArrayList<Premio> cercaPremiPiuRichiesti() {
        assert (elencoPremi.size() != 0) : "Attenzione! Non ci sono premi!";
        ArrayList<Premio> risultato = new ArrayList<Premio>();
        Premio p = elencoPremi.get(0);
        for (Premio premio : elencoPremi) {
            if (premio.getRichieste() > p.getRichieste()) {
                p = premio;
                risultato.add(p);
            } 
        }
        for (Premio premio : elencoPremi) {
            if (premio.getRichieste() == p.getRichieste()) {
                risultato.add(premio);
            }
        }
        return risultato;
    }
la maggior parte delle volte funziona bene, ma non capisco perchè a volte, cioè dopo che ho modificato le richieste di un premio, mi restituisce due volte lo stesso premio, cioè nel risultato mi trovo due elementi che sono lo stesso premio(cioè sia p che lo aggiungo nel primo ciclo e sia premio, che è uguale a p, dal secondo ciclo), dove sbaglio?
__________________
AMD A10 6700 || dissi Mugen3 || Asrock a88 fm2+ || Ram:2x4GB G.Skill 2133 || Samsung 840 evo 128GB || Asus 24' Led || Case CM N300 || Notebook: Santech v3510 (t9500-4GB-hd:100GB@7200rpm-8600GT-3dmark05:6900)|| Non fate affari con gli utenti Spytek e betick!!!
giogts è offline   Rispondi citando il messaggio o parte di esso
Old 18-02-2009, 13:37   #15
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Codice:
public ArrayList<Premio> cercaPremiPiuRichiesti() {
        assert (elencoPremi.size() != 0) : "Attenzione! Non ci sono premi!";
        ArrayList<Premio> risultato = new ArrayList<Premio>();
        Premio p = elencoPremi.get(0);
        for (Premio premio : elencoPremi) {
            if (premio.getRichieste() > p.getRichieste()) {
                p = premio;
                risultato.add(p);
            } 
        }
        for (Premio premio : elencoPremi) {
            if (premio.getRichieste() == p.getRichieste()) {
                risultato.add(premio);
            }
        }
        return risultato;
    }
Nel primo ciclo usi un oggetto Premio (p) di appoggio per tenerti memorizzato l'ultimo premio con valore maggiore.

Nel secondo ciclo riutilizzi l'oggetto p (che attualmente punta a uno dei premi nell'array e incidentalmente è l'ultimo Premio che ha passato il controllo sulle richieste maggiori) per fare i confronti di uguaglianza con gli altri premi, solo che iteri di nuovo tutti i premi contenuti nell'array: ma almeno un Premio non lo devi confrontare: il Premio puntato da p stesso!

Altrimenti confronti un Premio (già inserito una volta in risultato) con se stesso e il confronto di uguaglianza passa per forza, così te lo ritrovi inserito una seconda volta.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 18-02-2009, 13:49   #16
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Quello che hai scritto non funziona. Il primo ciclo accumula nella lista tutti i premi le cui richieste siano maggiori dell'ultimo inserito.

Il secondo aggiunge tutti quelli che le cui richieste siano uguali a quelle del premio più richiesto, tra cui il più richiesto precedentemente già inserito.

Il codice è sempre codice di qualcosa. Il qualcosa che devi codificare è, in questo caso, un algoritmo.

Prova a scandire idealmente il tuo array alla ricerca dei premi più richiesti.

[per ogni premio p nella lista premi]

se p è il primo elemento allora il suo numero di richieste è anche il massimo attuale.

[se p è il primo elemento allora aggiungo p ai risultati]

Nel caso in cui p non sia il primo elemento che succede?

Si danno tre casi: o le richieste di p sono maggiori del massimo (che è un qualsiasi elemento contenuto nei risultati), o sono minori del massimo o sono uguali al massimo.

Se è minore non ce ne frega nulla: a noi interessa il top del top.

[se p.richieste < delle richieste di un qualsiasi premio in risultati non si fa nulla]

Se è uguale allora è un risultato utile: è uno dei massimi richiesti

[se p.richieste = alle richieste di un qualsiasi premio in risultati allora aggiungo p ai risultati]

Se è maggiore allora abbiamo un nuovo massimo. Sappiamo che tutti gli elementi in risultati hanno lo stesso numero di richieste perchè questo ha fatto il nostro algoritmo fino ad adesso, quindi tutti i valori già accumulati vanno scartati, perchè non sono massimi, e il premio corrente viene aggiunto solo soletto ai risultati

[se p.richieste > delle richieste di un qualsiasi premio in risultati allora svuoto risultati e ci metto p]

Riepilogando, in pseudo codice meno pseudo di prima l'algoritmo è:

Codice:
ArrayList risultati
per ogni elemento p di elencoPremi
	if risultati.size() == 0 //xchè risultati è vuoto solo se p è il primo elemento
		risultati.add(p)
	else if(p.richieste = risultati.get(0).richieste) 
		risultati.add(p)
	else if(p.richieste > risultati.get(0).richieste) 
		risultati.clear(), 
		risultati.add(p);
return risultati
E' giusto? Bisognerebbe darne una dimostrazione logica ma fortunatamente non sono in grado di farlo. Intuitivamente appare corretto.

E qui inizi a codificare, cioè a tradurre in codice java il tuo algoritmo.
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 18-02-2009, 13:57   #17
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
Quello che hai scritto non funziona. Il primo ciclo accumula nella lista tutti i premi le cui richieste siano maggiori dell'ultimo inserito.
Ma porc... è vero, chiedo venia
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
Old 18-02-2009, 18:16   #18
giogts
Senior Member
 
L'Avatar di giogts
 
Iscritto dal: Sep 2001
Città: (Potenza)
Messaggi: 4660
Quote:
Originariamente inviato da PGI-Bis Guarda i messaggi
Quello che hai scritto non funziona.
ti assicuro che funziona, il primo ciclo prende correttamente il premio che ha il maggior valore di richieste, il problema credo che sia come dice banryu79, non dovrei includere p nel secondo ciclo di confronto, ma come faccio ad escluderlo?
inoltre non sono sicuro di aver capito la tua risposta
il fatto è che sono agli inizi, quindi magari non riesco ancora a capire il tuo ragionamento
__________________
AMD A10 6700 || dissi Mugen3 || Asrock a88 fm2+ || Ram:2x4GB G.Skill 2133 || Samsung 840 evo 128GB || Asus 24' Led || Case CM N300 || Notebook: Santech v3510 (t9500-4GB-hd:100GB@7200rpm-8600GT-3dmark05:6900)|| Non fate affari con gli utenti Spytek e betick!!!

Ultima modifica di giogts : 18-02-2009 alle 18:21.
giogts è offline   Rispondi citando il messaggio o parte di esso
Old 18-02-2009, 22:19   #19
PGI-Bis
Senior Member
 
L'Avatar di PGI-Bis
 
Iscritto dal: Nov 2004
Città: Tra Verona e Mantova
Messaggi: 4553
Sei certo di non aver testato il metodo con una seguenza particolare di premi? Lo chiedo perchè balza agli occhi una sequenza che certamente non produce risultati corretti.

Supponiamo di avere la seguente lista di premi (indico solo il numero di richieste);

1 2 3 4 5 5

Denoto a [=, >, <] b le operazioni a.getRichieste() [=, >, <] b.getRichieste(). Intendo per a = numero a.getRichieste() = quel numero.

il tuo algoritmo (la successione di operazioni sedicenti atomiche che producono un risultato a partire da un valore) è:

p è il primo premio nella lista (cioè 1)
per ogni premio x nella lista (incluso p)
se x > p aggiungi x ai risultati, p = x

Applichiamo questa prima parte alla lista 1 2 3 4 5. Io direi che capiti questo:

p vale 1,

x vale 1, x > p = falso, continua [risultati = vuoto ]
x vale 2, x > p = vero, aggiungi x, p = x, [risultati = 2]
x vale 3, x > p = vero, aggiungi x, p = x, [risultati = 2, 3]
x vale 4, x > p = vero, aggiungi x, p = x, [risultati = 2, 3, 4]
x vale 5, x > p = vero, aggiungi x, p = x, [risultati = 2, 3, 5]
x vale 5, x > p = false, continua [risultati = 2, 3, 5]

La seconda parte dice:

per ogni premio x nella lista
se x = p allora aggiungi x a lista

Dall'applicazione della prima parte risulta p = 5

l'iterazione fa questo:

x vale 1, x = p falso, continua
x vale 2, x = p falso, continua
x vale 3, x = p falso, continua
x vale 4, x = p falso, continua
x vale 5, x = p vero, aggiungi x, [risultati = 2, 3, 5, 5]
x vale 5, x = p vero, aggiungi x, [risultati = 2, 3, 5, 5, 5]

Questo risultato è corretto?
__________________
Uilliam Scecspir ti fa un baffo? Gioffri Cioser era uno straccione? E allora blogga anche tu, in inglese come me!
PGI-Bis è offline   Rispondi citando il messaggio o parte di esso
Old 19-02-2009, 09:21   #20
banryu79
Senior Member
 
L'Avatar di banryu79
 
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
Quote:
Originariamente inviato da giogts Guarda i messaggi
ti assicuro che funziona, il primo ciclo prende correttamente il premio che ha il maggior valore di richieste, il problema credo che sia come dice banryu79, non dovrei includere p nel secondo ciclo di confronto, ma come faccio ad escluderlo?
No lascia, ha ragione PGI, il tuo metodo non è corretto perchè per particolari sequenze di input sembra fare il suo dovere, mentre per altre no.

Invece prova a prendere spunto dal suo primo post: il processo mentale che ti ha descritto è un buon esempio del modo di procedere quando ci si trova difronte la neccessità di scrivere un piccolo algoritmo; ti ha illustrato passo-passo i singoli step di costruzione teorica dell'algoritmo per risolvere uno specifico problema e ti ha scritto pure il pseudocodice.

Solo alla fine, quando si ha una ragionevole certezza della correttezza logica del proprio algoritmo, si procede con l'implementazione del codice.

Io ti consiglio di rileggerti con calma il suo post, armarti di carta e penna, pensare al tuo problema: cosa ricevi in ingresso, cosa devi produrre in uscita e quindi scrivere in pseudo codice tutti i singoli passaggi logici che compongono la tua soluzione.
__________________

As long as you are basically literate in programming, you should be able to express any logical relationship you understand.
If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it.
(Chris Crawford)
banryu79 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Antigravity A1: drone futuristico per riprese a 360° in 8K con qualche lacuna da colmare Antigravity A1: drone futuristico per riprese a ...
Sony Alpha 7 V, anteprima e novità della nuova 30fps, che tende la mano anche ai creator Sony Alpha 7 V, anteprima e novità della ...
realme GT 8 Pro Dream Edition: prestazioni da flagship e anima racing da F1 realme GT 8 Pro Dream Edition: prestazioni da fl...
OVHcloud Summit 2025: le novità del cloud europeo tra sovranità, IA e quantum OVHcloud Summit 2025: le novità del cloud...
Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI Care e DisplayPort 2.1a Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI C...
Netflix si prende HBO, Harry Potter e il...
Meta, arriva il nuovo supporto dell'acco...
Spunta blu sotto accusa: perché l...
Motorola presenta edge 70 Cloud Dancer: ...
La Lexus LFA ritorna, ma è elettr...
Cristiano Ronaldo entra nell'intelligenz...
Wi-Fi 7 Mesh in ogni stanza: guida defin...
Hytale evita Steam al lancio per non ric...
Ritorna il bonus elettrodomestici: ripar...
La Russia blocca Snapchat e FaceTime: 'u...
Tesla FSD ora permette di scrivere messa...
Total War festeggia 25 anni: annunciato ...
Tante offerte Amazon rinnovate: sono ott...
Tanti articoli Apple scontati su Amazon:...
JBL a prezzi super: due modelli top tra ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 14:09.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v