我正在尝试从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方式执行此操作?也许我可以用不同的方式来解决这个问题?
答案 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”,反之亦然