2015-04-02 5 views
2

У меня есть Map<String,List<Map<String,String>>> invoices нижеGroovy печати Карта <String, List <Map <String, String >>> данные

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

UPDATE: Am пытается обновить Map<String,List<Map<String,String>>> invoices с invoiceErrors как ниже

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 

Am пытается достичь ниже карты Если сообщение об ошибке оленьей кожи имеет номер строки она должна быть добавлена ​​на верхнем уровне, как ошибка invLineItems.put('error',['INV-Error_Test1' : файла: файл находится в неподдерживаемом формате ])В противном случае ErrorMessage должен быть приложен к согласующей ФАКТУРЕ и 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

+0

Просто собирайтесь бросить это там: большую часть времени, когда у вас есть карта >, что вы действительно хотите, это Multimap. http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/collect/Multimap.html – dnault

ответ

1

Требуется только одна итерация.

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'] дает значение второй записи карт, итерация, на котором получает запись вложенной карты.

Если вам просто нужно значения LINE затем

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

должно быть достаточно.

+0

Спасибо за решение, я очень благодарен – RanPaul

+0

Можете ли вы проверить обновленный вопрос и предложить какие-либо изменения пожалуйста? – RanPaul

+0

Есть ли способ создать новую карту хэша без итерации по invLineItems – RanPaul

Смежные вопросы