2015-04-02 5 views
0

Am пытается обновить Map<String,List<Map<String,String>>> invoices с invoiceErrors нижеGroovy Map <String, List <Map <String, String >>> данные манипуляции

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 подхода

ответ

1

Это выглядит достаточно Groovy Мне :-) Если вы не хотите быть uber groovy.

Однако вы могли бы написать что-то вроде этого:

def regex = /^Line\s(?:(\d+)\s)?\s*:\s+(\d+)?.+/ 
invLineItems.each {e-> 
    int lineNumber 
    if (it.errorMessage ==~ regex) { 
     Matcher m = it.errorMessage =~ /\d+/ 
     if (m.find()) { 
      lineNumber = m.group() as Integer 
     }   
     println "lineNumber $lineNumber"  
    } 
    if(e.value['LINE_ITEM_NUMBER'].find{it==lineNumber.toString()}) { 
     def data = lipErrors.findAll{it.invoiceNumber==e.key && it.errorMessage ==~ Pattern.compile("^Line\\s+"+lineNumber+"?\\:\\s+"+lineNumber+"?.+")} 
     e.value.each{it['error'] = data.errorMessage.join("|")} 
    } 
} 

В основном здесь я пытаюсь использовать некоторые регулярные выражения операторов, а также исключительно перебор с использованием каждой формы, типа литья с использованием в качестве ключевого слова. Ничего особенного. Да, и я избавился от всех точек с запятой.

+0

Спасибо за ответ. Я ценю это. Можете ли вы также помочь мне с этим http://stackoverflow.com/questions/29570648/java-8-find-and-replace-matching-strings – RanPaul

+0

можете помочь мне с этим http://stackoverflow.com/questions/30789467/groovy-groupby-field-with-white-spaces – RanPaul

+0

не могли бы вы помочь мне решить эту проблему? https://stackoverflow.com/questions/47717505/groovy-create-a-map-with-jax-b-objects-specific-attributes – RanPaul

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