我有以下列表 -
A = List(("192.168.20.1", "WinInfra", List("naa.6d867d9c7ac")),
("192.168.20.1", "TriSQLFreshInstall", List("naa.6d867d",
"naa.42704fdc4")),
("192.168.20.1", "redHat7", List("naa.4270cdf",
"naa.427045dc")))
B = List("4270cdf", "427045dc", "42704fdc4")
我想检查列表A的最后一个元素(它是一个字符串列表)是否包含列表B中的任何子字符串,并仅将输出作为不匹配的元素。
编辑:我想检查列表B中是否存在列表B的任何元素,并且只收集列表A中不包含列表B元素的列表元素。
我想要关注输出 -
List(("192.168.20.1","WinInfra",List( "naa.6d867d9c7ac")))
如何使用scala获得以上输出?
答案 0 :(得分:2)
我认为是这样的:
A.filterNot(a => B.exists(b => a._3.exists(str => str.contains(b))))
或
A.filterNot(a => a._3.exists(str => B.exists(b => str.contains(b))))
或更短,但不太可读
A.filterNot(_._3 exists (B exists _.contains))
答案 1 :(得分:2)
首先,我不会传递元组。如果你将这个数据结构放入一个对象并使用它,那将会容易得多。但是,首先找到匹配会更容易。因此,您首先在列表A上应用过滤器:
A.filter { (ip, disc, sublist) => .... }
子列表项中的项目在列表B中:
sublist.exists(sublistItem => b.contains(sublistItem.replaceAll("naa.", "")))
返回:
res1: List[(String, String, List[String])] = List((192.168.20.1,TriSQLFreshInstall,List(naa.6d867d, naa.42704fdc4)), (192.168.20.1,redHat7,List(naa.4270cdf, naa.427045dc)))
这与你想要的相反。这很容易通过说filterNot:
来纠正A.filterNot { (ip, disc, sublist) => sublist.exists(sublistItem => b.contains(sublistItem.replaceAll("naa.", ""))) }