【问题标题】:Implement excel Loopup Function in scala在scala中实现excel查找功能
【发布时间】:2020-07-10 14:03:58
【问题描述】:

我有两个数组

arrayLong = Array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i')

arrayShort = Array('c', 'h')

如果该位置值存在于arrayShort 中,则我必须与1 形成相同长度的arrayLong 的第三个数组,否则0

对于上面的例子,我需要输出Array(0, 0, 1, 0, 0, 0, 0, 1, 0),因为arrayShort 中只有c, h,所以它们的位置更新为1

【问题讨论】:

  • 这和spark有什么关系?

标签: arrays scala apache-spark scala-collections


【解决方案1】:

一种选择是使用带有 if else 的 map

val arrayShort=Array ('c','h')
val arrayLong=Array('a','b','c','d','e','f','g','h','i')
val result = arrayLong.map(f => if(arrayShort.contains(f)) 1 else 0)

结果

result: Array[Int] = Array(0, 0, 1, 0, 0, 0, 0, 1, 0)

【讨论】:

  • arrayLong 是一个很长的数组,遍历它的所有值将是一个非常繁重的操作。
  • 但是您想转换所有值对吗?可以有像arrayLong = Array('a','a') 这样的重复值吗?它们应该留在那里吗?
  • 我不想完全转换我有一个只有 0 和 1 的相同长度的数组。我想声明一个长度为 LongArray 的 0 数组,然后通过迭代 shortArray 来更新它。
【解决方案2】:
def lookup[T](in: Array[T], values: Array[T]): Array[Int] = {
  val valuesSet = new mutable.HashSet[T] ++ values
  in.map(i => if (valuesSet.contains(i)) 1 else 0)
}

lookup(Array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'), Array('c', 'h'))

注意:转换为 set 使该函数运行时 O(n + m)

【讨论】:

  • arrayLong 是一个很长的数组,遍历它的所有值将是一个非常繁重的操作。
  • 只要使用一个可变的HashSet,整个算法就会下降到O (n + m)
  • @Harshit 但您必须至少查看每个元素一次才能知道它们是否属于较小的数组,不是吗?
  • @bottaio 这是一个不可变的集合,所以它有一个 trie 支持。它在O(n lg n) 中运行。
  • @bottaio:这就是 stackoverflow 的用途:)
猜你喜欢
  • 2019-07-05
  • 1970-01-01
  • 2019-09-05
  • 1970-01-01
  • 1970-01-01
  • 2012-03-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
相关资源
最近更新 更多