比较两个映射并使用Groovy或Java查找差异

时间:2016-03-07 18:38:28

标签: groovy

我想在两个地图中找到差异并创建一个新的csv文件,区别(并将**之间的差异)如下所示:

地图1

  [
    [cuInfo:"T12",service:"3",startDate:"14-01-16 13:22",appId:"G12355"],
    [cuInfo:"T13",service:"3",startDate:"12-02-16 13:00",appId:"G12356"],
    [cuInfo:"T14",service:"9",startDate:"10-01-16 11:20",appId:"G12300"], 
    [cuInfo:"T15",service:"10",startDate:"26-02-16 10:20",appId:"G12999"]  
]

地图2

[
    [name:"Apple", cuInfo:"T12",service:"3",startDate:"14-02-16 10:00",appId:"G12351"],
    [name:"Apple",cuInfo:"T13",service:"3",startDate:"14-01-16 13:00",appId:"G12352"],
    [name:"Apple",cuInfo:"T16",service:"3",startDate:"14-01-16 13:00",appId:"G12353"],
    [name:"Google",cuInfo:"T14",service:"9",startDate:"10-01-16 11:20",appId:"G12301"], 
    [name:"Microsoft",cuInfo:"T15",service:"10",startDate:"26-02-16 10:20",appId:"G12999"],
    [name:"Microsoft",cuInfo:"T18",service:"10",startDate:"26-02-16 10:20",appId:"G12999"]  
]   

如何获得如下所示的输出csv

Map 1 data | Map 2 data
service 3;name Apple;
cuInfo;startDate;appId | cuInfo;startDate;appId
T12;*14-02-16 10:00*;*G12351* | T12;*14-01-16 13:22*;*G12355*
T13;*14-01-16 13:00*;*G12352* | T13;*12-02-16 13:00*;*G12356*
service 9;name Google;       
T14;*10-01-16 11:20*;*G12301* | T12;*10-01-16 11:20*;*G12300*   

由于

1 个答案:

答案 0 :(得分:1)

在下文中,我假设地图列表已正确排序,以便比较公平,并且两个列表的长度相同:

首先,创建一个Iterator来同时遍历两个列表:

@groovy.transform.TupleConstructor
class DualIterator implements Iterator<List> {
    Iterator iter1
    Iterator iter2

    boolean hasNext() {
        iter1.hasNext() && iter2.hasNext()
    }

    List next() {
        [iter1.next(), iter2.next()]
    }

    void remove() {
        throw new UnsupportedOperationException()
    }
}

接下来,处理列表以获取CSV文件的行:

def rows = new DualIterator(list1.iterator(), list2.iterator())
    .findAll { it[0] != it[1] } // Grab the non-matching lines.
    .collect { // Mark the non-matching values.
        (m1, m2) = it
        m1.keySet().each { key ->
            if(m1[key] != m2[key]) {
                m1[key] = "*${m1[key]}*"
                m2[key] = "*${m2[key]}*"
            }          
        }

        [m1, m2]
    }.collect { // Merge the map values into a List of String arrays
        [it[0].values(), it[1].values()].flatten() as String[]
    }

最后,以CSV格式写出标题和行。注意:我使用了正确的CSV;您的示例实际上是无效,因为列数不一致:

def writer = new CSVWriter(new FileWriter('blah.csv'))
writer.writeNext(['name1', 'cuInfo1', 'service1', 'startDate1', 'appId1', 'name2', 'cuInfo2', 'service2', 'startDate2', 'appId2'] as String[])
writer.writeAll(rows)
writer.close()

输出如下:

"name1","cuInfo1","service1","startDate1","appId1","name2","cuInfo2","service2","startDate2","appId2"
"Apple","T12","3","*14-02-16 10:00*","*G12351*","Apple","T12","3","*14-01-16 13:22*","*G12355*"
"Apple","T13","3","*14-01-16 13:00*","*G12352*","Apple","T13","3","*12-02-16 13:00*","*G12356*"
"Google","T14","9","10-01-16 11:20","*G12301*","Google","T14","9","10-01-16 11:20","*G12300*"