2016-04-02 25 views
4

BitSet kullanan bir kütüphanem var ve kütüphaneyi kullanmak için Set [Int] tipi verilerini değiştirmem gerekiyor.BitSet to Set [Int] veya tam tersi Scala

Akla ilk gelen şey, .toSeq:_* işlemlerini kullanmaktır, ancak bunun BitSet'ten Set [Int] veya başka bir şekilde çevrilmesine dönüştürmenin etkili bir yol olduğundan emin değilim.

scala> BitSet(Set(1,2,3).toSeq:_*) 
res55: scala.collection.immutable.BitSet = BitSet(1, 2, 3) 

scala> Set(BitSet(1,2,3).toSeq:_*) 
res56: scala.collection.immutable.Set[Int] = Set(1, 2, 3) 

Daha iyi bir yolu var mı?

+0

İkincisi, '.toSet' veya' .seq' çalışmalıdır – Bergi

+0

Belki [Bir aralıktan bir scala BitSet'i başlatma] (http://stackoverflow.com/q/6366976/1048572) ilk yardım için – Bergi

cevap

5

Scala'nın Set hiyerarşi biraz garip, ama sadece vb Set[Int] beklediği bir yöntem,

bir BitSet geçebilir yüzden, bir süper türü olarak Set[Int] sahiptir BitSet Eğer durum bu olmayabilir varsayılan olarak Set varsayılan olarak Set olsun (scala.collection altında), kullandığınız kitaplığıile, immutable.BitSet değil, doğrudan çalışıyor olabilir. Bu, örnek kodunuzda her şeyin immutable olduğu durum için geçerli değil, ancak bunun ne kadar basit olduğundan emin değilim. Bir scala.collection.BitSet var nasılsa, sadece kullanmak,

scala> import scala.collection.immutable.BitSet 
import scala.collection.immutable.BitSet 

scala> val bs = BitSet(0, 100, 200) 
bs: scala.collection.immutable.BitSet = BitSet(0, 100, 200) 

scala> def takesSet(s: Set[Int]): Int = s.size 
takesSet: (s: Set[Int])Int 

scala> takesSet(bs) 
res0: Int = 3 

:

sen şanslı iseniz

Set ve BitSet hem immutable paketin sürümleri, BitSet Set için yön önemsiz ile çalışmaktan toSet: diğer yönde için

scala> takesSet(scala.collection.BitSet(0, 100, 200).toSet) 
res1: Int = 3 

, sürüm gayet:

scala> val s = Set(1, 2, 3) 
s: scala.collection.immutable.Set[Int] = Set(1, 2, 3) 

scala> BitSet(s.toSeq: _*) 
res2: scala.collection.immutable.BitSet = BitSet(1, 2, 3) 

Ama birçok durumda bazı CanBuildFrom sihirli bu dönüşümü önleyebilirsiniz fazlalaştı var:

scala> val bs: BitSet = BitSet(Set("1", "2", "3").map(_.toInt).toSeq: _*) 
bs: scala.collection.immutable.BitSet = BitSet(1, 2, 3) 

Ama bunun yerine:

scala> val bs: BitSet = Set("1", "2", "3").map(_.toInt)(collection.breakOut) 
bs: scala.collection.immutable.BitSet = BitSet(1, 2, 3) 

Bu aşağıdaki aynı sonucu üretir BitSet'dan önce bir ara kümenin (ve dizinin) oluşturulmasıyla, collection.breakOut parametresi, derleyicinin haritayı CanBuildFrom örneğini kullanarak gerçekleştirmesini söyler BitSet doğrudan yapacak tip sınıf. CanBuildFrom örneğini bu şekilde açıkça iletmek, yalnızca map için değil, flatMap, scanLeft, ++ ile çalışacak ve öğe türünü değiştirmenize izin veren diğer koleksiyon işlemleri.

0

Think nesne yönelimli: Başka yolu daha zordur gidiyor

 import scala.collection._ 
    val set: Set[Int] = BitSet(1,2,3) 

ve lineer zaman alacaktır: BitSetdiğer bir tane dönüştürmek için her şeyi yapmaya gerek yoktur, bir Set[Int] olduğunu :

 val bs: BitSet = BitSet(set.toStream:_*) 

ama ne zaman kendinizi "upconverting" bu tür ihtiyacı bulmak ihtiyacı ortadan kaldırmak için geliştirilmeli değil de, zamanın% 99 o kötü tasarım işaretidir: uygulama detayları o Özel Set, sadece başlangıçta onu oluşturan kod için önemli olmalıdır, aşağı akış kodu genellikle uygulamanın agnostik olmalıdır.

+0

"% 99" un çok iyimser olduğunu düşünüyorum. Genellikle 'BitSet'lerle (ya da bir üçüncü taraf API'sı nedeniyle ya da' BitSet'e özgü işlemlere ihtiyaç duyduğunuz için) çalışmanız gerektiğinde sıkça karşılaşacaksınız. Bunu mümkün kılmak için "alt" sıradan setleri "BitSet" alt türüne dönüştürür. –

+1

@TravisBrown belki, ben iyimserim :) Ben sadece bir set kullanmam gerektiğini düşünmek zor buluyorum, bu yüzden ben yaratmış değilim. Bazıları olduğundan eminim, sanırım insanlar neredeyse bu dönüşümleri gerçekten ihtiyaç duyup duymadıklarını düşünmeden geri döndürdüler. 'Set' '' '' '' '' '' '' '' '' 'scala.collection.immutable.Set'' değil' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' da IMHO yardımcı değil. – Dima