2016-04-12 9 views
0

私はScalaを初めて使うのですが、Scalaは固定長のSortedMapをサポートしていますか?Scalaの固定長SortedMap

私が考えていることは以下のことを行いマップです:

  • が追加されると作成
  • 時にMAX_SIZEパラメータを受け取り、小切手すでに存在する場合がある場合の要素
    • をMAX_SIZE最小のキーとその値を最初に削除します(キーはIntになります)
    • 次に、キーと値をマップに追加します。

は、厳密に言えば、私がソートされるマップは必要ありませんが、我々は最小のキー

を削除している場合、私が私を転がり始めた前に、私がお聞きしたかった利用可能/必要なようです自分の。また、私はこれをSamzaの下で実行します。これはシングルスレッドであると考えられ、同時実行性は問題にならないでしょう。

私はあなたがキーによって要素の順序を保証するTreeMapに基づいて、このような単純な何かを行うことができScalaの2.10

+0

可能な重複http://stackoverflow.com/questions/3802370/java-time-based-map-cache -with-expiring-keys) – LaloInDublin

+0

デフォルトのコレクションはありません。 scalaでは不変なオブジェクトを使うべきです。そのため、Mapはそのサイズを変更すべきではありません(addは別のMapを返します)。それでも、そのためのコレクションがあるかもしれません。 – pedrorijo91

+0

注:scala 2.12はほとんど外に出ています(既に出ていますか?)、すでに2.11に移行しているはずです。 – pedrorijo91

答えて

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 
} 

は、それを使用する方法である:

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) 

あなたのニーズに合わせてもっと便利にすることは明らかです。

+0

ありがとうございました!これは非常に役に立ちます。私はあなたが最小の要素よりも小さい要素をセットの中に追加し続けると、最小のキーが2で0を追加しているという小さなバグが見つかりました。結果はあまり正しくありません。 – benhsu

+0

私はそれをあなたのやり方と同じように書こうと思っていましたが、私はあなたの要求に従いました。どちらもさまざまな状況で有効です。 –

0

アレクシーの答えは非常に役に立ちました。私はそこに小さな修正を作っ

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) 
[期限切れキーでJavaタイムベースマップ/キャッシュ](の
+0

私はそれをあなたのやり方と同じように書こうと思っていましたが、私はあなたの必要条件を守りました。どちらもさまざまな状況で有効です。 –

+0

大丈夫!顧客は彼が何を望んでいたのか分からなかった:) – benhsu