Re: Cercare un elemento in una lista

29 views
Skip to first unread message
Message has been deleted

Ivano Pagano

unread,
Nov 9, 2012, 5:52:45 AM11/9/12
to sug...@googlegroups.com
xlist find (_ == xelem)

Studia le librerie esistenti prima di proseguire.

http://www.scala-lang.org/api/current/index.html#scala.collection.immutable.List

On Friday, November 9, 2012 11:27:19 AM UTC+1, Emanuele Losanno wrote:
Salve,
mi serve una funzione per cercare un elemento in una lista.
Siccome ho molte liste di tipi diversi ho realizzato una funzione generale.
Volevo mostrarvela per sapere cosa ne pensavate e se puo andar bene.

Non ho mai usato le eccezzioni e volevo sapere se è corretto come ho fatto.

// Funzione base search: Ricerca di un elemento in una lista.

// La funzione accetta due argomenti,

// la lista in cui cercare l'elemento e l'elemento da cercare

  def search[T](xlist: List[T], xelem: T) : T = {

    val i = xlist indexOf xelem         // Restituisce l’indice del primo element in xlist uguale a xelem, o -1 se non compare

    if (xlist == Nil) throw new Exception ("La lista è vuota, nessun elemento trovato")

    else if (i>=0) xlist(i)

    else throw new Exception ("L'elemento: " + xelem + " non è stato trovato in " + xlist)

  }//search


Cosa ne pensate?
E' la prima che mi è venuta in mente. Avete una versione più elegante o più funzionale.
Message has been deleted

Ivano Pagano

unread,
Nov 9, 2012, 6:22:11 AM11/9/12
to sug...@googlegroups.com
(xlist find (_ == xelem)).get

cosi' hai l'eccezione che volevi.

In ogni caso per me non e' una buona pratica lanciare un'eccezione per segnalare una condizione naturale, come il fatto di non trovare un elemento in una lista.
Di fatto l'Option serve proprio a gestire questo caso comune, visto che e' molto piu' frequente rispetto al caso in cui la presenza dell'elemento nella lista debba essere garantita sempre.

On Friday, November 9, 2012 12:02:33 PM UTC+1, Emanuele Losanno wrote:
L'avevo preso in considerazione find, solo che restituisce un elemento di tipo Option[T].
Quindi se non trova l'elemento richiesto, mi restituisce None, senza lanciare un eccezione o stampare un messaggio.
Ci devo pensare un po'.

Andrea Ferretti

unread,
Nov 9, 2012, 9:22:01 AM11/9/12
to sug...@googlegroups.com
Anzi, al contrario ci sono funzioni della libreria standard per convertire eccezioni in Option. Queste si possono usare quando si ha a che fare con librerie Java che segnalazioni condizioni di errore tramite eccezioni e si vuole convertirle in qualcosa di più idiomatico.

Ad esempio


> import scala.util.control.Exception.allCatch
> allCatch opt 3
res0: Option[Int] = Some(3)
> allCatch opt { sys.error("Crash!") }
res1: Option[Nothing] = None
> allCatch  either { sys.error("Crash!") }
res2: Either[Throwable,Nothing] = Left(java.lang.RuntimeException: Crash!)
Message has been deleted

Piergiuliano Bossi

unread,
Nov 19, 2012, 11:05:56 PM11/19/12
to sug...@googlegroups.com


2012/11/19 Emanuele Losanno <emanuel...@gmail.com>
Salve ragazzi,
una piccola curiosità...
Esiste un metodo per stampare il nome della variabile a cui è stata assegnata una classe.
Mi esprimo con un esempio:

  class Persona (val nome: String, val cognome: String)

  val PER1 = new Persona ("Giovanni", "Rossi")

 

  println ("PER1" + " è una classe di tipo: " + PER1.getClass())


Vorrei che anche "PER1" fosse chiamato con un metodo di scala.



In generale direi che non si puo' fare, essenzialmente perche' Scala ha i limiti che Java stesso ha in termini di Reflection. E poi direi che a meno di casi estremi non e' proprio il caso di bucare l'astrazione che ti fornisce il compilatore Scala e insozzarti le mani con Reflection.

Puoi arrivarci vicino con ASM, ma non e' chiaramente quello che volevi fare tu (e direi che e' ancora peggio di Reflection).


Ciao,
Giuliano


--
Piergiuliano Bossi
Blog: http://thinkingbox.wordpress.com/
Twitter: http://twitter.com/thinkingbox (English)
Twitter: http://twitter.com/scatolapensante (Italiano)

Reply all
Reply to author
Forward
0 new messages