4

いくつかの繰り返し番号を含む Scala List があります。特定の数字が繰り返される回数を数えたい。例えば:

val list = List(1,2,3,3,4,2,8,4,3,3,5)
val repeats = list.takeWhile(_ == List(3,3)).size

そして valrepeatsは に等しくなり2ます。

明らかに、上記は疑似コードであり、整数を表すため、2 つの s のtakeWhile繰り返しは見つかりません。と の両方を混ぜてみましたが、ほとんど成功しませんでした。また、Scala リストで繰り返し可能な要素の数を見つける方法のコードも参照しましたが、作成者は別のことを達成しようとしているようです。3_takeWhiletake(2)

ご協力いただきありがとうございます。

4

6 に答える 6

5

これは次の場合に機能します。

val repeats = list.sliding(2).count(_.forall(_ == 3))

Sliding(2) メソッドは、要素と後続要素のリストの反復子を提供し、これら 2 つが 3 に等しい場所をカウントします。

問題は、List(3, 3, 3) に対して正しい結果が作成されるかどうかです。それを2回にするか、1回だけにするか。

于 2013-09-28T05:24:54.833 に答える
1
val repeats = list.sliding(2).toList.count(_==List(3,3))

より一般的には、次のコードは要素のタプルを返し、すべての要素の値を繰り返します。

scala> list.distinct.map(x=>(x,list.sliding(2).toList.count(_.forall(_==x))))
res27: List[(Int, Int)] = List((1,0), (2,0), (3,2), (4,0), (8,0), (5,0))

これは、要素 '3' が 2 か所で連続して 2 回繰り返され、他のすべての要素が 0 回繰り返されることを意味します。

また、要素を 3 回連続して繰り返したい場合は、次のようにコードを変更するだけです。

list.distinct.map(x=>(x,list.sliding(3).toList.count(_.forall(_==x))))

SCALA REPL:

scala> val list = List(1,2,3,3,3,4,2,8,4,3,3,3,5)
list: List[Int] = List(1, 2, 3, 3, 3, 4, 2, 8, 4, 3, 3, 3, 5)

scala> list.distinct.map(x=>(x,list.sliding(3).toList.count(_==List(x,x,x))))
res29: List[(Int, Int)] = List((1,0), (2,0), (3,2), (4,0), (8,0), (5,0))

関数を次のように定義することで、スライディング値も変化させることができます。

def repeatsByTimes(list:List[Int],n:Int) =
list.distinct.map(x=>(x,list.sliding(n).toList.count(_.forall(_==x))))

今REPLで:

scala> val list = List(1,2,3,3,4,2,8,4,3,3,5)
list: List[Int] = List(1, 2, 3, 3, 4, 2, 8, 4, 3, 3, 5)

scala> repeatsByTimes(list,2)
res33: List[(Int, Int)] = List((1,0), (2,0), (3,2), (4,0), (8,0), (5,0))

scala> val list = List(1,2,3,3,3,4,2,8,4,3,3,3,2,4,3,3,3,5)
list: List[Int] = List(1, 2, 3, 3, 3, 4, 2, 8, 4, 3, 3, 3, 2, 4, 3, 3, 3, 5)

scala> repeatsByTimes(list,3)
res34: List[(Int, Int)] = List((1,0), (2,0), (3,3), (4,0), (8,0), (5,0))

scala>

与えられた整数のリストのようにさらに進んで、要素のいずれかがリスト内で発生する可能性のある連続した繰り返しの最大数が与えられた場合、(要素、この要素の繰り返し回数) を表す 3 タプルのリストが必要になる場合があります。 、この繰り返しが発生した場所の数)。これは、上記よりも網羅的な情報です。次のような関数を記述することで実現できます。

 def repeats(list:List[Int],maxRep:Int) =
 { var v:List[(Int,Int,Int)] = List();
 for(i<- 1 to maxRep)
 v = v ++ list.distinct.map(x=> 
 (x,i,list.sliding(i).toList.count(_.forall(_==x))))
 v.sortBy(_._1) }

SCALA REPL:

scala> val list = List(1,2,3,3,3,4,2,8,4,3,3,3,2,4,3,3,3,5)
list: List[Int] = List(1, 2, 3, 3, 3, 4, 2, 8, 4, 3, 3, 3, 2, 4, 3, 3, 3, 5)


scala> repeats(list,3)
res38: List[(Int, Int, Int)] = List((1,1,1), (1,2,0), (1,3,0), (2,1,3), 
 (2,2,0), (2,3,0), (3,1,9), (3,2,6), (3,3,3), (4,1,3), (4,2,0), (4,3,0), 
 (5,1,1), (5,2,0), (5,3,0), (8,1,1), (8,2,0), (8,3,0))

scala>

これらの結果は、次のように理解できます。

   1 times the element '1' occurred at 1 places.
   2 times the element '1' occurred at 0 places.
   ............................................
   ............................................
   .............................................
   2 times the element '3' occurred at 6 places..
   .............................................
   3 times the element '3' occurred at 3 places...
   ............................................and so on.
于 2018-07-12T04:32:33.410 に答える
0

あなたの疑似コードから、私はこれを機能させました:

val pairs = list.sliding(2).toList  //create pairs of consecutive elements
val result = pairs.groupBy(x => x).map{ case(x,y) => (x,y.size);   //group pairs and retain the size, which is the number of occurrences.

resultになるので、次のMap[List[Int], Int]ように数を数えることができます。

 result(List(3,3))    // will return 2 

複数のサイズのリストも確認したい場合は、パラメーターをsliding目的のサイズに変更する必要があるかどうかわかりませんでした。

于 2013-09-28T15:52:12.067 に答える
0

リストがそれほど長くないことがわかっている場合は、Stringsを使用してリストを作成できます。

val list = List(1,2,3,3,4,2,8,4,3,3,5)
val matchList = List(3,3)
(matchList.mkString(",")).r.findAllMatchIn(list.mkString(",")).length
于 2013-09-28T11:03:42.693 に答える