如何以Scala方式从多维数组中删除重复值?

时间:2013-06-27 09:50:35

标签: arrays scala sorting filtering

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

这是我的测试:

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”, “与Orjan”, “尼尔森”]

[1] [ “4321”, “EVA-丽萨”, “尼曼”]

[2] [ “1234”, “EVA”, “尼尔森”]

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

[0] [ “1234”, “与Orjan”, “尼尔森”]

[1] [ “4321”, “EVA-丽萨”, “尼曼”]

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

2 个答案:

答案 0 :(得分: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))

如果你有一个元素集合(在这种情况下是Array Array[String])并希望获得单个元素与某个属性的每个值(在这种情况下,属性是来自{{的第一个字符串) 1}})你应该根据这个属性(Array[String])对集合的元素进行分组,然后以某种方式从每个组中选择一个元素。在这种情况下,我们从每个组中选取了第一个元素(arr.groupBy( _(0)))。

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

Map

在这种情况下,您将从每个组中获取最后一个元素。

答案 1 :(得分:0)

有点隐含,但应该有效:

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))

在这里反向覆盖“eva”,“nilsson”与“rjan”,“nilsson”,反之亦然