Groovy打印Map <string,list <map <string,string>&gt;&gt;数据</串,列表<地图<字符串,字符串>

时间:2015-04-02 00:19:00

标签: java groovy

我有Map<String,List<Map<String,String>>> invoices如下

invLineItems = [INV-Error_Test1:[[LINE:1, INVOICE_DATE:20150301, INVOICE_NUMBER:INV-Error_Test1, INVOICE_TOTAL:22], [LINE:2, INVOICE_DATE:20150301, INVOICE_NUMBER:INV-Error_Test1, INVOICE_TOTAL:24]], 
            INV-Error_Test2:[[LINE:3, INVOICE_DATE:20150301, INVOICE_NUMBER:INV-Error_Test2, INVOICE_TOTAL:26], [LINE:4, INVOICE_DATE:20150301, INVOICE_NUMBER:INV-Error_Test2, INVOICE_TOTAL:28,]]]

我正在尝试将其打印如下

println " INV-Error_Test2 Details "
invLineItems.get('INV-Error_Test2').each{ 
    it.each{
print "LINE = "+ it['LINE'] 
    }
 }

我的误差低于groovy.lang.MissingPropertyException: No such property: LINE for class: java.util.LinkedHashMap$Entry

有人可以帮我打印这些数据吗?

注意:我实际上总共有24个标题,但是为了简化问题,我只发布了4个标题(Line, Invoice_Date,Invoice-Number,Invoice_Total)并尝试打印24个标题中的几个标题

更新:我尝试使用invoiceErrors更新Map<String,List<Map<String,String>>> invoices,如下所示

InvoiceError // is an entity with below attributes
{ String errorMessage,
  String invoiceNumber    
}
ErrorMessage                                          invoiceNumber   
-------------                                       -------------------     
File Error : The file is in an unsupported format   INV-Error_Test1
Line : 1 Invoice does not foot Reported             INV-Error_Test1
Line : 2 MATH ERROR                                 INV-Error_Test1
Line : 3 MATH ERROR                                 INV-Error_Test2
Line : 3 Invoice does not foot Reported             INV-Error_Test2

我试图在下面的地图上实现     如果错误消息没有行号,则需要在顶层附加invLineItems.put('error',['INV-Error_Test1' :文件错误:文件格式不受支持])    否则,错误消息应附加到匹配的INVOICE和linenumber,如下所示

invLineItems = [INV-Error_Test1:[[LINE:1, INVOICE_DATE:20150301, INVOICE_NUMBER:INV-Error_Test1, INVOICE_TOTAL:22, error : `Line : 1 Invoice does not foot Reported`], 
                                [LINE:2, INVOICE_DATE:20150301, INVOICE_NUMBER:INV-Error_Test1, INVOICE_TOTAL:24, error : `Line : 2 MATH ERROR`],
                INV-Error_Test2:[[LINE:3, INVOICE_DATE:20150301, INVOICE_NUMBER:INV-Error_Test2, INVOICE_TOTAL:26, , error : `Line : 3 MATH ERROR | Line : 3 Invoice does not foot Reported`], 
                                [LINE:4, INVOICE_DATE:20150301, INVOICE_NUMBER:INV-Error_Test2, INVOICE_TOTAL:28,]],
                error : [[INV-Error_Test1:`File Error : The file is in an unsupported format`]]

我写了下面的方法来实现上面的

def regex = "^Line\\s(?:(\\d+)\\s)?\\s*:\\s+(\\d+)?.+";
for (e in invLineItems ){
  def errors =  lipErrors.findAll{it.invoiceNumber==e.key} // finding the error messages with the invoice number
  errors.each{  // fetching the line numbre from error message and finding the matching record the invoice number and line number in invLineItems 
     int lineNumber
     if (it.errorMessage.matches(regex)) {
            Pattern p = Pattern.compile("\\d+");
            Matcher m = p.matcher(it.errorMessage);
            if (m.find()) {
                 lineNumber = Integer.parseInt(m.group());
            }
          println "lineNumber = "+lineNumber
        }

    if(e.value['LINE_ITEM_NUMBER'].find{it==lineNumber.toString()}) {
      def data = lipErrors.findAll{it.invoiceNumber==e.key && it.errorMessage.matches("^Line\\s+"+lineNumber+"?\\:\\s+"+lineNumber+"?.+")}
      e.getValue().each{it.put("error", data.errorMessage.join("|"))}

     }   

  }
}   

代码看起来不像Groovy并且主要使用传统的java代码,我想知道是否可以使用Groovy方法简化代码

1 个答案:

答案 0 :(得分:2)

只需要一次迭代。

def invLineItems = [
    'INV-Error_Test1': [ 
        [LINE:1, INVOICE_DATE:20150301, INVOICE_NUMBER:'INV-Error_Test1', INVOICE_TOTAL:22], 
        [LINE:2, INVOICE_DATE:20150301, INVOICE_NUMBER:'INV-Error_Test1', INVOICE_TOTAL:24]
    ], 
    'INV-Error_Test2': [ 
        [LINE:3, INVOICE_DATE:20150301, INVOICE_NUMBER:'INV-Error_Test2', INVOICE_TOTAL:26], 
        [LINE:4, INVOICE_DATE:20150301, INVOICE_NUMBER:'INV-Error_Test2', INVOICE_TOTAL:28,]
    ]
]

invLineItems['INV-Error_Test2'].each { 
    println "LINE = "+ it['LINE']
}

invLineItems['INV-Error_Test2']给出第二个Map条目的值,迭代得到嵌套的map条目。

如果您只需要LINE的值,那么

assert invLineItems.'INV-Error_Test2'*.'LINE' == [3, 4]

应该足够了。