如何使用scala检查列表是否包含来自其他列表的子字符串?

时间:2015-01-28 13:58:36

标签: list scala

我有以下列表 -

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获得以上输出?

2 个答案:

答案 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.", ""))) }
相关问题