2016-04-12 16 views
0

Scala'ya yeni geliyorum, Scala sabit bir uzunluğu destekliyor SortedMap?Sabit Uzunluk SortedMap in Scala

Ne aklınızda olan aşağıdakileri yapar bir haritasıdır:

  • bir eklenti üzerine yaratılış
  • üzerine bir max_size parametresini alır, çekler zaten elemanları
    • orada MAX_SIZE eğer varsa orada , en küçük anahtarı ve değerini ilk olarak (anahtar bir Int olacaktır) kaldırın, daha sonra anahtar ve değeri haritaya ekler.

Kesinlikle ben sıralanmasını haritaya ihtiyacı olmayan, konuşma, ama benim haddeleme başlamadan önce biz sormak istediğim en küçük anahtar

kaldırıyorsanız kullanılabilir/gerekli görünüyor kendi. Ayrıca Samza'nın altında çalışacağım, ki bu da tek bir iş parçacığı olduğuna inanıyorum ve bu yüzden eşzamanlılık bir endişe olmayacak.

Ben scala çıkıyorum 2.10

Anahtar tarafından öğelerin sırasını garanti TreeMap dayalı bu gibi basit bir şey yapabilirsiniz
+0

Olası kopyalar http://stackoverflow.com/questions/3802370/java-time-based-map-cache -with-expiring-keys) – LaloInDublin

+0

bunun için varsayılan bir koleksiyon yoktur. ama scalada değişmez nesneler kullanmalısınız, bu yüzden bir Harita boyutunu değiştirmemelidir (bir eklenti farklı bir Haritaya dönecektir). Yine de, belki – pedrorijo91

+0

nota için bazı koleksiyon var: scala 2.12 neredeyse çıktı (zaten dışarıda?), Zaten 2.11'e taşınmış olmalısınız :) – pedrorijo91

cevap

2

:

import scala.collection.immutable.TreeMap 

def add[K,V](map: TreeMap[K,V], elem: (K,V), maxSize: Int): TreeMap[K,V] = { 
    map.takeRight(maxSize - 1) + elem 
} 
İşte

nasıl kullanılacağını geçerli:

scala> val m = TreeMap(1 -> "one", 2 -> "two", 3 -> "three") 
m: scala.collection.immutable.TreeMap[Int,String] = 
Map(1 -> one, 2 -> two, 3 -> three) 

scala> val m1 = add(m, 0 -> "zero", 4) 
m1: scala.collection.immutable.TreeMap[Int,String] = 
Map(0 -> zero, 1 -> one, 2 -> two, 3 -> three) 

scala> val m2 = add(m1, 4 -> "four", 4) 
m2: scala.collection.immutable.TreeMap[Int,String] = 
Map(1 -> one, 2 -> two, 3 -> three, 4 -> four) 

scala> val m3 = add(m2, 5 -> "five", 4) 
m3: scala.collection.immutable.TreeMap[Int,String] = 
Map(2 -> two, 3 -> three, 4 -> four, 5 -> five) 

scala> val m4 = add(m3, 0 -> "zero", 4) 
m4: scala.collection.immutable.TreeMap[Int,String] = 
Map(0 -> zero, 3 -> three, 4 -> four, 5 -> five) 

Açıkça ihtiyaçlarınızı karşılamak için daha uygun hale getirmeye çalışabilirsiniz.

+0

Teşekkür ederiz! Bu çok yardımcı. Sette minimum elemandan daha küçük elemanlar eklemeye devam ederseniz (eğer en küçük anahtar 2 ise ve 0 ekliyorsanız) sonuç çok doğru olmayacaksa küçük bir hata buldum. – benhsu

+0

Bunu yaptığınız gibi yazmak istedim, ancak gereksinimlerinizi takip ettim - en küçüğü kaldır, sonra ekle. Her ikisi de farklı durumlar için geçerlidir. –

0

Aleksey'in cevabı çok yardımcı oldu. Bunun için küçük bir düzeltme yapılmış

import scala.collection.immutable.TreeMap 

def add[K,V](map: TreeMap[K,V], elem: (K,V), maxSize: Int): TreeMap[K,V] = { 
    (map + elem).takeRight(maxSize - 1) 
} 


val m = TreeMap(1 -> "one", 2 -> "two", 3 -> "three") 

val m1 = add(m, 0 -> "zero", 4) 

val m2 = add(m1, 4 -> "four", 4) 

val m3 = add(m2, 0 -> "zero", 4) 

val m4 = add(m3, 1 -> "one", 4) 

val m5 = add(m4, 0 -> "zero", 4) 

val m6 = add(m5, 1 -> "one", 4) 
[süresi dolan tuşlarıyla Java zamana dayalı harita/cache] (içinde
+0

Yaptığınız şekilde yazmak istedim, ancak gereksinimlerinizi takip ettim - en küçüğü kaldır, sonra ekle. Her ikisi de farklı durumlar için geçerlidir. –

+0

tamam! müşteri ne istediğini bilmiyordu :) – benhsu