List Groovy列表和映射
我正在编写selenium测试的助手方法。其中之一是:List Groovy列表和映射,list,map,groovy,List,Map,Groovy,我正在编写selenium测试的助手方法。其中之一是: private static List<DataRow> parseTable(WebElement table) { List<WebElement> tableHeaders = table.findElements(By.tagName("th")) List<DataRow> dataRow = table.findElements(By.xpath(".//tbody/t
private static List<DataRow> parseTable(WebElement table) {
List<WebElement> tableHeaders = table.findElements(By.tagName("th"))
List<DataRow> dataRow = table.findElements(By.xpath(".//tbody/tr")).collect {
Map<String, String> columns = [:]
it.findElements(By.tagName("td")).eachWithIndex { item, i ->
columns[tableHeaders.get(i).text] = item.text
}
new DataRow(it, columns)
}
return dataRow
}
有没有更好的方法从两个列表生成地图?您应该能够做到:
def columns = [tableHeaders,it.findElements(By.tagName("td"))].transpose().collectEntries()
作为解释:
鉴于:
def a = [ 'a', 'b', 'c' ]
def b = [ 1, 2, 3 ]
然后
以及:
如果
a
和b
的基数相同?@dmahapatro是的,否则您将在地图中获得与两个列表中较小的元素相同的元素数。我假设这是一种情况,因为上面的示例的行为相同(如果tableHeaders
更短,则会崩溃)。从行
和列
的角度考虑,这是有意义的。如果列的行中没有元素,则不会进行转置。相反,如果行没有列,则忽略该元素。例如:assert[['a',b'],[1,2,3].[transpose()=[[a',1],[b',2].
assert[[a',b',c'],[1,2].[1,2].[transpose()=['a',1','b',2].
它也可以使用两个以上的维度,但当任何子列表用尽时,它就会停止,即:assert[[1,2,3,4],'a','b'],'i','ii','iii].transpose][[1,'a','i'],[2,'b','ii']]
def a = [ 'a', 'b', 'c' ]
def b = [ 1, 2, 3 ]
def c = [ a, b ].transpose()
assert c == [ [ 'a', 1 ], [ 'b', 2 ], [ 'c', 3 ] ]
def d = c.collectEntries()
assert d instanceof Map
assert d == [ a:1, b:2, c:3 ]