Compare two maps and find differences using Groovy or Java

前端 未结 1 626
一生所求
一生所求 2021-01-27 07:11

I would like to find difference in two maps and create a new csv file with the difference (and put the difference between **) like below:

Map 1

  [
    [         


        
相关标签:
1条回答
  • 2021-01-27 07:27

    In the following I'm assuming that the list of maps is sorted appropriately so that the comparison is fair, and that both lists are of the same length:

    First, create an Iterator to traverse both lists simultaneously:

    @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()
        }
    }
    

    Next, process the lists to get rows for the CSV file:

    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[]
        }
    

    Finally, write the header and rows out in CSV format. NOTE: I'm using a proper CSV; your example is actually invalid because the number of columns are inconsistent:

    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()
    

    The output looks like this:

    "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*"
    
    0 讨论(0)
提交回复
热议问题