List.takeFirst ?

0 views
Skip to first unread message

Francesco Bochicchio

unread,
Jul 20, 2009, 6:08:08 AM7/20/09
to sug-it
Ciao a tutti,

devo estrarre da un lista il primo elemento che soddisfi una certa
condizione : una specie di List.takeFirst, come ho specificato
nell'oggetto.

Mi vengono in mente varie alternative:
1 - classico while ( found == false ) { ... } : efficiente ma tocca
scandire la lista 'a mano'
2. espressione for : ma non c'e modo di uscire dal ciclo quando la
condizione si verifica?
3. usare takeWhile con la condizione negata, poi usare la lunghezza
della lista ritornata
per determinare l'indice del primo elemento che verifica la
condizione : "triccoso", e
crea una lista di cui non ho alcuna necessità ...

Altre soluzioni?

Ciao
------
FB

Gustavo Nalle Fernandes

unread,
Jul 20, 2009, 6:49:56 AM7/20/09
to sug...@googlegroups.com
Potresti filtrare la lista con una funzione e poi ottenere il primo
elemento:

scala> val numbers = List(1,2,3,4,5)
numbers: List[Int] = List(1, 2, 3, 4, 5)

scala> val firstPair = list.filter(x => x % 2 == 0).head
firstPair: Int = 2


Ciao,
Gustavo

Francesco Bochicchio

unread,
Jul 20, 2009, 12:10:01 PM7/20/09
to sug-it


On Jul 20, 12:49 pm, Gustavo Nalle Fernandes <gustavona...@gmail.com>
wrote:
> Potresti filtrare la lista con una funzione e poi ottenere il primo
> elemento:
>
> scala> val numbers = List(1,2,3,4,5)
> numbers: List[Int] = List(1, 2, 3, 4, 5)
>
> scala> val firstPair = list.filter(x => x % 2 == 0).head
> firstPair: Int = 2
>
> Ciao,
> Gustavo
>


On Jul 20, 12:49 pm, Gustavo Nalle Fernandes <gustavona...@gmail.com>
wrote:
> Potresti filtrare la lista con una funzione e poi ottenere il primo
> elemento:
>
> scala> val numbers = List(1,2,3,4,5)
> numbers: List[Int] = List(1, 2, 3, 4, 5)
>
> scala> val firstPair = list.filter(x => x % 2 == 0).head
> firstPair: Int = 2
>
> Ciao,
> Gustavo
>

Ok. Ma io cercavo un modo di evitare di scandire tutta la lista.
Qualcosa del genere (non so se funziona ma compila :-)

def takeFirst( condition:(A)=>Boolean ) : Option[A] =
{
val it = value.elements;

var found:Option[A] = None;
if ( it.hasNext ) {
do {
val el = it.next;
if ( condition(el) == true ) found = Some(el);
} while ( (found == null) && it.hasNext )
}
return found;
}

Ciao
----
FB

Gustavo Nalle Fernandes

unread,
Jul 20, 2009, 12:18:44 PM7/20/09
to sug...@googlegroups.com

>
> Ok. Ma io cercavo un modo di evitare di scandire tutta la lista.
> Qualcosa del genere (non so se funziona ma compila :-)
>
> def takeFirst( condition:(A)=>Boolean ) : Option[A] =
> {
> val it = value.elements;
>
> var found:Option[A] = None;
> if ( it.hasNext ) {
> do {
> val el = it.next;
> if ( condition(el) == true ) found = Some(el);
> } while ( (found == null) && it.hasNext )
> }
> return found;
> }
>

Allora ti serve il "find" :)

scala> val firstPair = List(1,2,3,4,5).find(x => x % 2 == 0).get

Francesco Bochicchio

unread,
Jul 20, 2009, 1:15:11 PM7/20/09
to sug-it



>
> Allora ti serve il "find" :)
>
> scala>  val firstPair = List(1,2,3,4,5).find(x => x % 2 == 0).get
> firstPair: Int = 2
>
> Ciao,
> Gustavo

Come ***+ ho fatto a non vederlo ?
Si vede che l'età avanza ... :-(

Ciao & Grazie
-------------
FB
Reply all
Reply to author
Forward
0 new messages