コレクションの要素を再帰的に蓄積します

マルコ

次のような整数範囲の要素のコレクションがあります

case class Element(id: Int, from: Int, to: Int)
val elementColl: Traversable[Element]

そして私はそれらをに蓄積したい

case class ElementAcc(ids: List[Int], from: Int, to: Int)

次のアルゴリズムに従って:

  1. Element私から1つ取りelementCollそれを使用ElementsAccして、Element取られたものと同じfrom / toを持つ新しいものを作成します
  2. の残りの要素を繰り返し処理して、と重複する整数範囲を持つelementCollを探しElementますElementAcc
  3. 見つかった場合は、に追加ElementAccし、の整数範囲を拡張してElementAcc、新しい範囲を含めます。Element
  4. 何も見つからない場合は、elementCollまだ割り当てられていない残りの要素に対して上記のプロセスを繰り返します。ElementAcc

これにより、のコレクションが作成されElementAccます。ただ再帰的にアキュムレータに要素を追加することが簡単に十分に思えますが、私はの縮小サイズを処理する方法がわからないelementColl、私は同じことを追加しないようにElement複数のElementAccさん

編集:範囲の拡張については不明確だったと思います。例でこれを明確にしましょう:

私のアキュムレータの範囲は現在1〜5です。6〜8の範囲の要素はアキュムレータの範囲と重複しないため、含まれません。4から7の範囲の要素はオーバーラップし、含まれ、結果のアキュムレータの範囲は1から7になります。

グウェンゼク

私はこのように行きます:

1)とを取りElementAccElementを返す関数を記述しますElementAcc関数は次のようになります。

def extend(acc: ElementAcc, e: Element): ElementAcc = {
  if(acc.from <= e.from && e.from <= acc.to)
    ElementAcc(e.id :: acc.ids, acc.from, math.max(acc.to, e.to))
  else if (acc.from <= e.to && e.to <= acc.to)
    ElementAcc(e.id :: acc.ids, math.min(acc.from, e.from), acc.to)
  else acc
}

foldLeft多くの場合、オブジェクトを蓄積するときに適したソリューションです。アキュムレータの初期値と、アキュムレータと要素を受け取り、アキュムレータを返す関数が必要です。次に、のすべての要素を蓄積しますtraversable

編集:

2)異なるリストに蓄積するには、aList[ElementAcc]Elementを組み合わせる別の関数を作成する必要があります

def overlap(acc: ElementAcc, e: Element): Boolean = {
  (acc.from <= e.from && e.from <= acc.to) || (acc.from <= e.to && e.to <= acc.to)
} 

def dispatch(accList: List[ElementAcc], e: Element): List[ElementAcc] = accList match {
  case Nil => List(ElementAcc(List(e.id), e.from, e.to))
  case acc :: tail =>
    if (overlap(acc, e)) extend(acc, e) :: tail
    else acc :: dispatch(tail, e)
}

3)そしてそれはfoldLeftで使用されます:

val a = Element(0, 0, 5)
val b = Element(1, 3, 8)
val c = Element(2, 20, 30)
val sorted = List(a, b, c).foldLeft(List[ElementAcc]())(dispatch)

sorted: List[ElementAcc] = List(ElementAcc(List(1, 0),0,8), ElementAcc(List(2),20,30))

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

コレクションの遅延を再帰的に計算する方法

分類Dev

コレクション - コレクションに要素を追加します

分類Dev

コレクションのコレクションのすべての要素に関数を適用します

分類Dev

すべてのコンストラクタオプションを再帰的にプルしますか?

分類Dev

Integerオブジェクトのコレクションを取得してこれらの要素を追加するこの反復関数を再帰的な関数に変換する方法はありますか?

分類Dev

プロパティごとに重複を組み合わせて2つのコレクションを再帰的にマージします

分類Dev

パンダは線形回帰のデータを蓄積します

分類Dev

再帰アルゴリズムを指定して、再帰のシミュレーションを表示します

分類Dev

コレクションを再帰的にプリティプリントする

分類Dev

コレクションの要素を比較し、そのコレクションの最後の要素になるように設定します

分類Dev

蓄積されたカウンターのサイズが大きくなると、Pythonでのコレクションカウンターの蓄積が遅くなります

分類Dev

再帰を使用して、特定のパラメーターを持つコレクションのすべての組み合わせを取得します

分類Dev

各要素内のLaravelコレクションオブジェクトに新しい要素を追加します

分類Dev

ジャンクションを使用して再帰せずにすべてのファイルとディレクトリを一覧表示します

分類Dev

レクリエーションなしで再帰的に文字列を渡す

分類Dev

stringarrayの要素に基づいて、コレクションの名前を使用してpymongoにMongoDBコレクションを作成します。

分類Dev

<div>要素のコレクションをハイパーリンクします

分類Dev

より良いAPIアクセスのためにEloquentコレクションを再構築します

分類Dev

要素のタイプに応じて、コレクションから要素を取得します

分類Dev

反復中にコレクションの要素のdoubleインデックスを返します

分類Dev

Hibernateはトランザクションコミット時にコレクション要素を削除します

分類Dev

ruby:リンクの逆参照を使用してディレクトリを再帰的にコピーします

分類Dev

ディレクトリの*コンテンツ*を再帰的にコピーします

分類Dev

コレクションを関数に渡すことは、関数がコレクションの要素を変更できることを意味しますか?

分類Dev

Javaコレクション:コレクション内の要素を互いに比較し、1サイクルで削除します

分類Dev

Swiftの条件で、コレクションの最後の要素を削除します

分類Dev

HTMLコレクションを特定の条件を満たす要素のみに減らします

分類Dev

複数の要素でコレクションをブロックしますか?

分類Dev

meteor.js-クリックされた要素のIDをコレクションに渡します

Related 関連記事

  1. 1

    コレクションの遅延を再帰的に計算する方法

  2. 2

    コレクション - コレクションに要素を追加します

  3. 3

    コレクションのコレクションのすべての要素に関数を適用します

  4. 4

    すべてのコンストラクタオプションを再帰的にプルしますか?

  5. 5

    Integerオブジェクトのコレクションを取得してこれらの要素を追加するこの反復関数を再帰的な関数に変換する方法はありますか?

  6. 6

    プロパティごとに重複を組み合わせて2つのコレクションを再帰的にマージします

  7. 7

    パンダは線形回帰のデータを蓄積します

  8. 8

    再帰アルゴリズムを指定して、再帰のシミュレーションを表示します

  9. 9

    コレクションを再帰的にプリティプリントする

  10. 10

    コレクションの要素を比較し、そのコレクションの最後の要素になるように設定します

  11. 11

    蓄積されたカウンターのサイズが大きくなると、Pythonでのコレクションカウンターの蓄積が遅くなります

  12. 12

    再帰を使用して、特定のパラメーターを持つコレクションのすべての組み合わせを取得します

  13. 13

    各要素内のLaravelコレクションオブジェクトに新しい要素を追加します

  14. 14

    ジャンクションを使用して再帰せずにすべてのファイルとディレクトリを一覧表示します

  15. 15

    レクリエーションなしで再帰的に文字列を渡す

  16. 16

    stringarrayの要素に基づいて、コレクションの名前を使用してpymongoにMongoDBコレクションを作成します。

  17. 17

    <div>要素のコレクションをハイパーリンクします

  18. 18

    より良いAPIアクセスのためにEloquentコレクションを再構築します

  19. 19

    要素のタイプに応じて、コレクションから要素を取得します

  20. 20

    反復中にコレクションの要素のdoubleインデックスを返します

  21. 21

    Hibernateはトランザクションコミット時にコレクション要素を削除します

  22. 22

    ruby:リンクの逆参照を使用してディレクトリを再帰的にコピーします

  23. 23

    ディレクトリの*コンテンツ*を再帰的にコピーします

  24. 24

    コレクションを関数に渡すことは、関数がコレクションの要素を変更できることを意味しますか?

  25. 25

    Javaコレクション:コレクション内の要素を互いに比較し、1サイクルで削除します

  26. 26

    Swiftの条件で、コレクションの最後の要素を削除します

  27. 27

    HTMLコレクションを特定の条件を満たす要素のみに減らします

  28. 28

    複数の要素でコレクションをブロックしますか?

  29. 29

    meteor.js-クリックされた要素のIDをコレクションに渡します

ホットタグ

アーカイブ