2016-03-07 35 views
-1

我想找到兩個地圖差異分歧,創建具有差異一個新的CSV文件(並把**之間的差)如下圖所示:比較兩張圖,發現使用Groovy或Java

地圖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

那你試試?你如何讀寫文件? –

回答

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*" 
+0

@Rosa,它很棒,謝謝!我剛剛添加了def m1 = [:] def m2 = [:]以上面的代碼 – user3122166

+0

@Rosa,你能幫我嗎,我修改了上面的代碼,情況改變了,兩個列表的長度都不一樣,第二個列表還有一個元素 – user3122166

+0

好吧,那應該如何影響輸出呢? –