我在获取列表的元素时遇到了一个非常奇怪的问题
下面是我将参数作为"bc“和"mn”传递的代码片段。
val list1 = List("abc", "def", "mnp")
val list2 = List(args(0), args(1))
val header1=list1.filter(x => list2.exists(y => x.contains(y)))
println(header1)Output-List("abc","mnp")
我正在尝试一种不同的方法(通过传递相同的参数),但得到了一个空列表
val list1 = List("abc", "def", "mnp")
//val list2 = List(args(0), args(1))
val ipList1= new ListBuffer[Any]
for(i <- 0 to 1){
ipList1 +=args(i)
}
val list2=ipList1.toList
println(list2)
val header1=list1.filter(x => list2.exists(y => x.contains(y)))
println(header1)输出列表(bc,mn)
List ()-->这是我得到的空列表
有没有人能告诉我哪里做错了,怎么改正?
发布于 2019-12-09 22:11:55
问题是x.contains(y)并不是你想的那样。String有一个contains方法来检查另一个String是否是这个String的子字符串。但是在您的代码中,y没有String类型,而是Any类型。因此不会调用String的contains方法。这是WrappedString的contains方法,它将String x视为Seq[Char]。该方法不检查是否有任何子字符串等于y,而是检查是否有任何字符等于y。
显然,解决方案是使用ListBuffer[String]。
发布于 2019-12-09 21:25:55
问题是您使用的是ListBufferAny,因此元素丢失了从String到Any的类型信息,显然这改变了代码的语义。
您可以这样做:
val ipList1 = new ListBuffer[String]
for (i <- 0 to 1) {
ipList1 += args(i).toString
}
val list2 = ipList1.toList或者更好的是:
val list2 = args.slice(0, 2).toListhttps://stackoverflow.com/questions/59249758
复制相似问题