【问题标题】:How do I remove duplicate values from my Multidimensional array in a Scala way?如何以 Scala 方式从我的多维数组中删除重复值?
【发布时间】:2013-06-27 18:40:37
【问题描述】:

我正在尝试从字符串中提取一些值。该字符串包含几行带有值的行。每行的值是数字、名字、姓氏。然后我想按给定的模式过滤并删除重复的数字。

这是我的测试:

test("Numbers should be unique") {
    val s = Cool.prepareListAccordingToPattern(ALLOWED_PATTERN, "1234,örjan,nilsson\n4321,eva-lisa,nyman\n1234,eva,nilsson")
    assert(s.length == 2, "Well that didn't work.. ")
    info("Chopping seems to work. Filtered duplicate numbers. Expected 1234:4321, got: "+s(0)(0)+":"+s(1)(0))
  }

方法:

def prepareListAccordingToPattern(allowedPattern: String, s: String) : Array[Array[String]] = {
    val lines = chop("\n", s)
    val choppedUp = lines.map(line =>
      chop(",", line)).filter(array =>
        array.length == 3 && array(0).matches(allowedPattern)
      )    
    choppedUp
}

def chop(splitSymbol: String, toChop: String) : Array[String] = {
    toChop.split(splitSymbol)
  }

我的测试按预期失败,因为我收到了一个包含重复项的多维数组:

[0]["1234","örjan","nilsson"]

[1]["4321","eva-lisa","nyman"]

[2]["1234","eva","nilsson"]

我想做的是过滤掉重复的数字,在这种情况下 “1234” 让我回来:

[0]["1234","örjan","尼尔森"]

[1]["4321","eva-lisa","nyman"]

我应该如何以 scala 方式执行此操作?也许我可以用不同的方式解决这个问题?

【问题讨论】:

    标签: arrays scala sorting filtering


    【解决方案1】:
    val arr = Array(
      Array("1234","rjan","nilsson"),
      Array("4321","eva-lisa","nyman"),
      Array("1234","eva","nilsson")
    )
    
    arr.groupBy( _(0)).map{ case (_, vs) => vs.head}.toArray
    // Array(Array(1234, rjan, nilsson), Array(4321, eva-lisa, nyman))
    

    如果您有一个元素集合(在本例中为 ArrayArray[String])并且想要获取具有某个属性的每个值的单个元素(在本例中,属性是来自 Array[String] 的第一个字符串),您应该基于此属性 (arr.groupBy( _(0))) 对集合元素进行分组,然后以某种方式从每个组中选择一个元素。在本例中,我们从每个组中选取了第一个元素 (Array[String])。

    如果您想为每个组选择任何(不是必须的)元素,您可以将每个元素 (Array[String]) 转换为键值对 ((String, Array[String])),其中 key 是目标属性的值,然后将此对集合转换为Map

    val myMap = arr.map{ a => a(0) -> a }.toMap
    // Map(1234 -> Array(1234, eva, nilsson), 4321 -> Array(4321, eva-lisa, nyman))
    
    myMap.values.toArray
    // Array(Array(1234, eva, nilsson), Array(4321, eva-lisa, nyman))
    

    在这种情况下,您将获得每个组的最后一个元素。

    【讨论】:

    • 谢谢!这就是我要找的!我最终做了:choppedUp.map{ a => a.head -> a }.toMap
    【解决方案2】:

    有点隐晦,但应该可以:

    val arr = Array(
         Array("1234","rjan","nilsson"),
         Array("4321","eva-lisa","nyman"),
         Array("1234","eva","nilsson")
         )
    arr.view.reverse.map(x => x.head -> x).toMap.values
    // Iterable[Array[String]] = MapLike(Array(1234, rjan, nilsson), Array(4321, eva-lisa, nyman))
    

    在此处反转以用“rjan”,“nilsson”覆盖“eva”,“nilsson”,反之亦然

    【讨论】:

      猜你喜欢
      • 2018-01-18
      • 1970-01-01
      • 1970-01-01
      • 2017-06-01
      • 2018-09-17
      • 2011-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多