ListIterator

di il
10 risposte

ListIterator

Salve,

devo svolgere questo esercizio:

List<Integer> maggiori(Iterator<Integer> i, int n) che, dato un iteratore i (non nec-
essariamente ordinato) ed un intero n, restituisce una nuova lista contenente tutti i valori di i
che sono strettamente maggiori di n, nello stesso ordine in cui compaiono in i.
Esempio: se l'iteratore fa riferimento agli elementi [12,5,22,54,21,19,20] e n=20, il metodo
dovra restituire la lista [22,54,21].


Questo è il metodo:
 static List<Integer> maggiori(Iterator<Integer> i, int n)
    {
        List<Integer> Ris = new ArrayList<Integer>();
        while(i.hasNext())
        {
            if(i.next() > n)
               Ris.add(i.next());
        }
        
        return Ris;
    }
Con [12,5,22,54,21,19,20] ed n = 20 mi da, come risultato, [54,19].

Qual è il problema?

10 Risposte

  • Re: ListIterator

    davide.fruci ha scritto:


                if(i.next() > n)
                   Ris.add(i.next());
    Qual è il problema?
    Che il next() lo fai 2 volte! Testi il valore ad una posizione x e poi aggiungi quello alla posizione x+1.
  • Re: ListIterator

    Sì, avevo pensato ad una cosa del genere.. Quando entro nell'if, e quindi quando faccio Ris.add, come posso riferirmi all'elemento che ho confrontato nell'if ?
  • Re: ListIterator

    davide.fruci ha scritto:


    Sì, avevo pensato ad una cosa del genere.. Quando entro nell'if, e quindi quando faccio Ris.add, come posso riferirmi all'elemento che ho confrontato nell'if ?
    una variabile?
  • Re: ListIterator

    andbin ha scritto:


    una variabile?
    int temp;
    while(i.hasNext())
    {
        temp = i.next();
        if(temp > n)
            Ris.add(temp);
    }
    
    Non ci ho proprio pensato

    Grazie, buona giornata
  • Re: ListIterator

    davide.fruci ha scritto:


    int temp;
    while(i.hasNext())
    {
        temp = i.next();
        if(temp > n)
            Ris.add(temp);
    }
    
    Io avrei fatto:
    while (i.hasNext()) {
        Integer val = i.next();
        if (val > n) {
            Ris.add(val);
        }
    }
    La differenza? Nel tuo c'è un unboxing da Integer a int (riga del next) e poi un boxing da int a Integer (riga del add).
    Nel mio c'è solo 1 unboxing nella condizione del if.
  • Re: ListIterator

    Alternativamente:
    
    static List<Integer> maggiori(Iterator<Integer> it, int n)
    {
        ArrayList<Integer> vect = new ArrayList<>();
        it.forEachRemaining(t -> { if (t > n) vect.add(t);});
        return vect;
    }
    
    Cosi' eviti pure di fare cicli
  • Re: ListIterator

    andbin ha scritto:


    Nel tuo c'è un unboxing da Integer a int
    Con unboxing intendi un cast implicito?

    Ecco, ora che mi ci trovo ho un'altra domanda. Ho cercato su internet ma non ho trovato una spiegazione esaustiva.

    I tipi di dato primitivi, in Java, sono otto: byte, short, int, long, float, double, boolean, char.
    Che differenza c'è tra un int ed un Integer? Per quello che so il primo non è un oggetto, mentre il secondo sì. Inoltre, quest'ultimo risulta essere immutabile. Perché con gli ArrayList e gli Iterator bisogna usare Interger e non int?
    Integer non può essere definito un tipo di dato quindi..

    sottovento ha scritto:


    Alternativamente:
    
    static List<Integer> maggiori(Iterator<Integer> it, int n)
    {
        ArrayList<Integer> vect = new ArrayList<>();
        it.forEachRemaining(t -> { if (t > n) vect.add(t);});
        return vect;
    }
    
    Cosi' eviti pure di fare cicli
    Grazie mille
  • Re: ListIterator

    Ciao, con java 5 sono stati inserite le classi wrapper, che permettono di utilizzare i tipi primitivi come se fossero oggetti. Questo è utile quando devi usare un tipo di dato primitivo all'interno di un contesto in cui ci si aspetta un oggetto, come ad esempio nelle liste. Riguardo a queste ultime, dalla documentazione puoi vedere che l'interfaccia List è definita come List<E>, ovvero in modo parametrico. Quando utilizzi questa classe devi specificare un tipo di dato "reale" al posto di E, ovvero una classe, ad esempio Integer.
  • Re: ListIterator

    davide.fruci ha scritto:


    Con unboxing intendi un cast implicito?
    No, non è un banale "cast". Passare da int a Integer (o viceversa) è sempre stato possibile in Java, in qualunque release. Da Java 5 esiste il auto-boxing/unboxing che rende più facilmente interscambiabili i primitivi con le rispettive classi "wrapper" ma semplicemente perché è il compilatore che genera codice "nascosto" per fare questo passaggio.

    Integer i = new Integer(123); // qualunque versione di Java
    Integer i = 123; // solo da Java 5

    quest'ultimo viene tradotto dal compilatore in:

    Integer i = Integer.valueOf(123);

    Questo valueOf è stato introdotto da Java 5. Il compilatore non emette un banale new Integer(...) ma usa valueOf, che tra l'altro usa internamente un basilare meccanismo di caching per un certo range ridotto di valori.

    Idem, cioè similare, per gli altri primitivi.

    davide.fruci ha scritto:


    I tipi di dato primitivi, in Java, sono otto: byte, short, int, long, float, double, boolean, char.
    Che differenza c'è tra un int ed un Integer? Per quello che so il primo non è un oggetto, mentre il secondo sì.
    Semplicemente per ciascun primitivo è stata fatta una classe in java.lang che incapsula quel valore primitivo (e la cui classe offre anche altri metodi utili). Tutto qui.

    davide.fruci ha scritto:


    Inoltre, quest'ultimo risulta essere immutabile.
    Sì, le classi "wrapper" dei primitivi e anche String sono "immutabili". È stato scelto così .... l'immutabilità in generale (e specialmente per dei "value" object piccoli e basilari come questi) ha notevoli vantaggi.

    davide.fruci ha scritto:


    Perché con gli ArrayList e gli Iterator bisogna usare Interger e non int?
    Le collezioni, fin dall'inizio, trattavano solo "oggetti" (Object). I generics introdotti da Java 5 trattano solo tipi reference, quindi di nuovo oggetti, niente primitivi (List<Integer> SÌ, mentre List<int> NO).

    davide.fruci ha scritto:


    Integer non può essere definito un tipo di dato quindi..
    Integer è un "tipo reference", esattamente come String, Date, File, URL, ecc....
    Non è un tipo di "prima classe", se intendi in questo senso, come i tipi primitivi, non riceve cioè alcun trattamento particolare, a parte il auto-boxing/unboxing che comunque porta solo alla generazione di codice "dietro le quinte", come si dice.
  • Re: ListIterator

    Grazie mille ad entrambi per la spiegazione! Ora è tutto più chiaro.
Devi accedere o registrarti per scrivere nel forum
10 risposte