3

1 と -1 を含むリストがあります。私が求めている目標は、合計が -1 のときにリスト内の位置を見つけることです。

List[Int] = List(1, -1, 1, -1, 1, 1, -1, 1, -1, 1, -1, 1, 1, 1, 1, 1, -1, -1, -1, 1, -1, 
-1, 1, 1, -1, -1, 1, 1, -1, 1, 1, -1, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 1, 1, 1, 1,
 1, 1, 1, 1, 1, 1, 1, 1, 1, -1, 1, -1, -1, 1)

しかし、私のコードは機能していません。

これが私の試みです(読みやすくするためにコードの間隔を空けました)注:floorIntのリストを保持するvalです。

floor.foldLeft(0) { ( (x,y) => x+y == -1 ) }.indexOf(-1)

floor.foldLeft(0) ( (x,y) => {  (x + y == -1) {x.indexOf(-1)} }  )

floor.foldLeft(0) { (x,y) => { if (x + y == -1) { indexOf(-1) } } }

ここで何が間違っているのか知りたいです。私は本当に、答えそのものよりも理由を求めています。

4

2 に答える 2

2

無名関数 ( の 2 番目の引数foldLeft) は、1 番目の引数と同じ型を返す必要があります。

およびファミリはfoldreduceコレクションを取り、それを 1 つの値に減らすように設計されています。ここではうまくいきません。

これにより、必要なものが得られます。

floor.scanLeft(0)(_+_).indexOf(-1) - 1  // scan collection is 1 element longer

この場合scan、関心のある要素を照会できるさまざまなプロパティ/値を持つ新しいコレクションを生成します。


したがって、本当にを使用する必要がある場合はfoldLeft、これを試してください。

floor.zipWithIndex.foldLeft((0,-1)) {
  case ((s,x),(e,i)) => if (s+e == -1 && x < 0) (0,i) else (s+e, x)
}._2

s現在の合計 、および現在の場所のインデックス 、iおよび評価されている現在の要素を持ち歩く必要があるため、かなり醜いですe。目標を見つけた後、xそれを保持し、最後に展開する必要があります。 、._2

scanLeft結果をバージョンと比較します。- 1最終的な調整が必要であることがわかると思います。


これは、目的の目標に到達した場合に早期に救済できるという利点があるもう 1 つのアプローチです。

val floorSums:Stream[Int] = Stream.tabulate(floor.length){ idx =>
     floor(idx) + (if (idx>0) floorSums(idx-1) else 0)
}

floorSums.indexOf(-1)  // 38
于 2016-08-11T01:26:34.137 に答える