0

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

这是我的测试:

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","尼尔森"]

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

[2][“1234”,“伊娃”,“尼尔森”]

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

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

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

我应该如何以scala方式做到这一点?也许我可以以不同的方式解决这个问题?

4

2 回答 2

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

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

于 2013-06-27T10:06:15.300 回答
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))

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

于 2013-06-27T10:19:13.677 回答