2

groupBytakeWhile、またはgroupedが自分のやりたいことを達成できるかどうか確信が持てませんでした。指定したい間隔に従って、数値のリストを自動的にグループ化する関数を開発する必要があります。このユース ケースでは、年齢のリストを取得し、それらを動的な年齢カテゴリ (1 ~ 5、5 ~ 10 など) に分類しています。ユーザーが間隔を変更したい場合があるため、動的である必要があります。

たとえば、番号のリストがあります。List(103, 206, 101, 111, 211, 234, 242, 99)

10、または で間隔をあけることができます100。の入力の結果は次の100ようになりますList(List(99),List(101,103,111),List(206,211,234,242))

過去 1 時間 Google と SO を検索しましたが、何も見つかりませんでした。助けてくれてありがとう!

4

2 に答える 2

4

あなたが望むでしょうgroupBy

val xs = List(103, 206, 101, 111, 211, 234, 242, 99)

xs.groupBy(_ / 100)
// Map(0 -> List(99), 1 -> List(103, 101, 111), ...)

grouped実際の要素を見ずに、指定されたサイズの後続の塊を作成するだけです。takeWhile述語が成り立つ限り、主要な要素を取ります。


結果のマップでメソッドを使用してwithDefaultValue、いくつかのエントリが空のインデックス付きシーケンスとして表示することができます。

val ys = xs.groupBy(_ / 100) withDefaultValue Nil
ys(0)  // List(99)
ys(4)  // List() !
于 2013-06-04T23:04:03.993 に答える
1

範囲を生成し、その範囲内の値をフィルター処理するアプローチを次に示します。l.groupBy(_ / 100).valuesの方が好ましいと思いますが。

val interval = 100

//This gives List(Vector(0, 100), Vector(100, 200), Vector(200, 300))
val intervals = 0 until l.max + interval by interval sliding(2) 


for(interval <- intervals; 
      within <- List(l.filter(x => x > interval(0) && x <= interval(1)))
   ) yield within

これにより、次のval l = List(103, 206, 101, 111, 211, 234, 242, 99)ようになります。

List[List[Int]] = List(List(99), List(103, 101, 111), List(206, 211, 234, 242))
于 2013-06-04T23:38:46.727 に答える