2016-07-22 2 views
0

Je regarde la classe mutable Set et voir union, intersect, diff, etc. Toutes ces opérations ensemble créent un nouveau Set. J'étais curieux de savoir s'il y avait un moyen de mettre à jour le Set plutôt que d'en créer un nouveau. Sinon, je dois passer de val à var ou suivre des étapes supplémentaires.Scala: définir les opérations qui mettent à jour la collection?

Dans le cas où je ne suis pas clair, considérons la classe HashSet de .NET. Il a IntersectWith, ExceptWith et UnionWith qui modifient la collection. Alors que les méthodes d'extension LINQ Intersect, Except et Union créer de nouvelles collections. J'espère trouver quelque chose d'équivalent aux variantes "Avec".

est ici une approche inefficace qui reconstitue la collection à partir de zéro:

val temp = original.diff(other) 
original.clear() 
original ++= temp 

De toute évidence, il serait plus efficace de le faire:

for (value <- other if original.contains(value)) { 
    original.remove(value) 
} 
+0

Voulez-vous dire passer 'var' à' val' peut-être? :) – Alec

+0

Non, 'val' à' var'. Je veux conserver la même référence à la même collection. Je veux * muter * cette collection plutôt que de remplacer la référence à une nouvelle collection. –

+0

Mon mauvais. Tout à fait raison. Un 'val' à un ensemble mutable. Erreur de débutant. – Alec

Répondre

2

Voir: http://docs.scala-lang.org/overviews/collections/sets.html#operations-in-class-mutableset

Par exemple:

Ajouts: xs + = x Ajoute l'élément x pour définir xs comme effet secondaire et renvoie xs lui-même.

Il suffit donc d'ignorer la valeur retournée. L'ensemble devrait être mis à jour sur place.

+0

Imaginez que je voulais prendre 'diff' de sorte que le' Set' d'origine ne contenait plus les valeurs dans un autre ensemble. La collection originale devrait rétrécir. Je devrais trouver les éléments ayant besoin d'être supprimés, puis '- =' de l'ensemble d'origine. Suivant? –

+2

Eh bien ce n'est pas ce que vous avez demandé :-) Vous pouvez '- =' une séquence d'éléments, ce qui devrait avoir l'effet que vous voulez. '- =' ne devrait avoir aucun effet pour les éléments qui ne sont pas dans l'ensemble. –