2016-03-30 6 views
0

私は以下の値を持つデータの入ったストリームを持っています。
国、都市、州ネストされた値とカウント数にはどのようなデータ構造が最適ですか?

一意の値の最大数に伴って(例えば50,22,12)を格納します。
私は、上記の値とそのサブ値の出現数を維持するシステムを設計する必要があります。実際の値ストアETCを格納する代わりに、値の最大数を超える場合。

国と出現
米国および出現
都市の数と定義された時間間隔の要件で出現

の数のカウントは、サブタイプの数と一緒にすべてのカウントを計算することです。例: このシステムからの出力値は次のようになります。

国A 435、状態B 264、シティC 321
国A 153、状態B 122、シティC 534

私のシステムは、以下の制限を適用シティC 300
国B 123、状態B 825、 。
1.データベースシステムを使用して値を格納および検索することはできません。
2.速度と簡単さのために、これはメモリ内にある必要があります(したがって最大値の保存に制限されます)。
3.値は特定の間隔でクリアされます。
4.これらの値はネストされているため、別々のテーブルを使用して3つのフィールドを別々に追跡することはできません。

ネストされた値とそのカウントを格納するカスタムデータ構造の使用について考えました。 他のどのような方法でも、私はデザインに従うことができます。どのデータ構造を使用できますか? 似たような既存の例はありますか?

注:これは宿題ではありません。私は自分のアプリケーションを開発していますが、この要件のための洗練されたソリューションを設計することに悩まされています。この質問がStackOverflowにとってあまりにも一般的であるか不適切であると思うなら、それを閉じるか投票する前にこのフォーラムに質問してください。いずれの肯定的なフィードバックも高く評価

擬似コード:ここで

class Location { 
// local storage 
private val subLocationCounter = HashMap[Location, Long]; 

// method to add new location 
addLocation(Location loc) 
// method to get current count of locations 
getCounts() 
// method to get current count of locations values recursively 

} 
+0

申し訳ありませんが、要件が非常に明確ではありません。実装について考えたカスタムデータ構造の擬似コードを表示できる場合は、他の人が、より良いデータ構造を改善または提案するのに役立つかもしれません。 –

+0

あなたの時間をありがとう@AmnaAliを投稿していただきありがとうございます。私のカスタムデータ構造では、Map を持つ単純なクラスLocationを使うことを考えました。私は、各入れ子にされた国 - >州 - >都市の位置値をインスタンス化し、インクリメントすることを計画しています。'' 'コードクラスの場所{ プライベートval subLocationCounter = HashMap [Location、Long];再帰的 } '' ' – user300313

+0

場所値の現在のカウントを取得するための場所 //メソッドの現在のカウントを取得するために、新しい場所に //メソッドを追加する //メソッド'編集を使用して、あなたのオリジナルのポストであなたのコードを入れてください'。 – WhatsUp

答えて

0

があなたの "再帰的なデータ構造" である:

import scala.collection.mutable 

case class State(var count:Int = 0, cities:mutable.Map[String, Int] = mutable.Map()) 
case class Country(var count:Int = 0, states:mutable.Map[String, State] = mutable.Map()) 

val countries = mutable.Map[String, Country]() 

List(
    ("A", "B", "C"), 
    ("A", "B", "D"), 
    ("B", "B", "C") 
).foreach { 
    case (countryName, stateName, cityName) => 
    val country = countries.getOrElseUpdate(countryName, new Country) 
    val state = country.states.getOrElseUpdate(stateName, new State) 
    country.count += 1 
    state.count += 1 
    state.cities(cityName) = state.cities.getOrElse(cityName, 0) + 1 
} 

countries("A") 
countries("B") 

結果:

res1: Country = Country(2,Map(B -> State(2,Map(D -> 1, C -> 1)))) 
res2: Country = Country(1,Map(B -> State(1,Map(C -> 1)))) 
関連する問題