使用Scala计算数组B中的数组A的元素

时间:2014-12-31 16:44:15

标签: arrays scala

我有两个字符串数组,比如说

A = ('abc', 'joia', 'abas8', '09ma09', 'oiam0') 

B = ('gfdg', '89jkjj', '09ma09', 'asda', '45645ghf', 'dgfdg', 'yui345gd', '6456ds', '456dfs3', 'abas8', 'sfgds'). 

我想要做的只是计算B中出现的A中每个字符串的元素数量(如果有的话)。例如,此处生成的数组应为:C = (0, 0, 1, 1, 0)。我怎么能这样做?

3 个答案:

答案 0 :(得分:6)

试试这个:

A.map( x => B.count(y => y == x)))

答案 1 :(得分:3)

你可以这样做,idursun建议,它会工作,但可能效率不高,好像你先准备交叉点。如果B比A大得多,它将带来巨大的加速。 'intersect'方法具有更好的'big-O'复杂度,然后对B中A的每个元素进行线性搜索。

  val A = Array("abc", "joia", "abas8", "09ma09", "oiam0") 
  val B = Array("gfdg", "89jkjj", "09ma09", "asda", "45645ghf", "dgfdg", "yui345gd", "6456ds", "456dfs3", "abas8", "sfgds")

  val intersectCounts: Map[String, Int] =
    A.intersect(B).map(s => s -> B.count(_ == s)).toMap

  val count = A.map(intersectCounts.getOrElse(_, 0))

  println(count.toSeq)

结果

(0, 0, 1, 1, 0)

答案 2 :(得分:0)

使用foldLeft构造作为A:

的每个元素的收益率
  val A = List("a","b")
  val B = List("b","b")

  val C = for (a <- A) 
          yield B.foldLeft(0) { case (totalc : Int, w : String) =>
      totalc + (if (w == a) 1 else 0)
    }

结果:

C: List[Int] = List(0, 2)