2010-11-03 19 views
5

Perché c'è una mancanza di coerenza tra insiemi ed elenchi nell'API di Scala Collections?Incoerenze di collezioni Scala

Ad esempio, c'è un Set immutabile, ma anche uno mutabile. Se voglio utilizzare questi ultimi, posso semplicemente fare questo:

val set = Set[A]() 
set += new A 

Tuttavia, non esiste un elenco mutevole, di per sé. Se voglio scrivere uno snippet di codice simile usando Lists, quale struttura dati usare? LinkedList suona come un buon candidato, perché è mutabile, ma non ha + = metodo definito. ListBuffer sembra soddisfare i requisiti, ma non è un elenco.

Dopo aver letto 2.8 documenti Raccolte vengo alla conclusione che la MutableList è probabilmente la soluzione migliore.

Continuo a desiderare che esistesse scala.collection.mutable.List.

+1

E non modificabile. Mable Set? :-) –

risposta

20

La ragione di questo è che Java ha cooptato il tipo funzionaleList significare qualcosa che non è (cioè java.util.List non è un lista).

Probabilmente non ha senso che un linguaggio di programmazione funzionale abbia un mutabileList in quanto tale tipo è un ossimoro. Quindi ListBuffer o ArrayBuffer. O semplicemente usa IndexedSeq, di cui esistono implementazioni mutevoli e immutabili

3

ArraySeq può essere quello che stai cercando, tranne + = è eccezionalmente lento. È anche possibile utilizzare java.util.ArrayList e import collection.JavaConversions._

Sembra che a Scala manchi una buona raccolta di tipo Lista mutabile con indice di tempo costante (come ArrayList per java).

In ogni caso, si noti che "Elenco" si riferisce esattamente al tipo "scala.immutable.List". Quindi Seq (o qualche altro tipo di raccolta più astratto), è il tipo che ci si dovrebbe aspettare dai metodi piuttosto che da "List" se si desidera generalizzare le raccolte immutabili/mutabili.

Più ideale è richiedere un IndexedSeq, che indica che l'operazione di indicizzazione è performante per quella raccolta. Tuttavia, non sono sicuro che ListBuffer rientri in quella categoria.

+0

Che mi dici di ArrayBuffer? –

+3

La "buona collezione di liste mutevoli di Scala" "come ArrayList per java" è ArrayBuffer. –

+0

ArrayBuffer è ottimo per aggiungere ma non è buono per anteporre. L'ArrayList di Java cercherà effettivamente di ammortizzare anche i costi per renderlo leggermente migliore a mio avviso. Sì ArrayBuffer è probabilmente abbastanza buono se stai semplicemente aggiungendo un elenco e elementi di indicizzazione. – jsuereth

2

Perché Set è solo un tratto: è astratto e richiede un'implementazione. Quindi si può parlare di classi che sono mutable.Set o immutable.Set.

Nel frattempo, List è una classe, un'implementazione del tratto (astratto) immutable.LinearSeq. Non ci può mai essere un'altra classe che sia anche una List. Troverete, tuttavia, che ci sia un mutable.LinearSeq caratteristica.

In termini Java, si confrontano le interfacce con le classi: sono distinte.

+0

La distinzione in sett. Il 16.8 del libro scala, l'oggetto Elenco globale (i metodi non funzionano su tutti gli oggetti Elenco) rispetto alla classe Elenco, è degno di nota. –

9

La sequenza/lista analogo Set nelle biblioteche di raccolta di Scala è Seq. List è solo un particolare, immutabile attuazione Seq, come è Vector. ArrayBuffer o ListBuffer sono implementazioni tipiche di mutable.Seq.

+0

Grazie per il semplice chiarimento - questo mi ha sempre infastidito. –

0

Non dimenticare scala.collection.mutable.{LinkedList,DoubleLinkedList}. Sono mutabili e sono LinearSeq. La mutazione è un po 'strana: puoi modificare la testa assegnando al riferimento elem e alla coda assegnando al riferimento next.

Ad esempio, questo ciclo modifica tutti i valori negativi a zero.

val lst = collection.mutable.LinkedList(1, -2, 7, -9) 
var cur = lst 
while (cur != Nil) { 
    if (cur.elem < 0) cur.elem = 0 
    cur = cur.next 
} 

Questo ciclo rimuove ogni secondo elemento dall'elenco.

var cur = lst 
while (cur != Nil && cur.next != Nil) { 
    cur.next = cur.next.next 
    cur = cur.next 
} 

Non sto suggerendo che questi siano meglio dell'elenco immutabile. Sto solo facendo notare che Scala ha liste mutabili che sembrano abbastanza simili a quelle che hai visto nella tua classe delle strutture dati.

Problemi correlati