2015-09-12 4 views
0

Хорошо, так у меня есть этот список карт:Список карт GroupBy или собирать

List data = [ 
    [name: "John", age: 21, gender: "male", option1: "test", option2: "test2"], 
    [name: "Doe", age: 23, gender: "male", option1: "", option2: "test2"], 
    [name: "Kate", age: 25, gender: "female", option1: "test", option2: ""], 
    [name: "Ann", age: 22, gender: "female", option1: "", option2: ""] 
] 

Так что я хочу им быть сгруппированы следующим образом:

Map<String, Object[]> data = new TreeMap<String, Object[]>() 
    data.put("1", ["ID", "name", "age", "gender","option1", "option2"]) 
    data.put("2", [1, "John", 21, "male", "test", "test2"]) 
    data.put("3", [2, "Doe", 23, "male", "", "test2"]) 
    data.put("4", [3, "Kate", 25, "female", "test", ""]) 
    data.put("5", [4, "Ann", 21, "female", "", ""]) 

Или что-то, что будет выглядеть так, потому что Я вставляю это в файл excel. Или если кто-то может порекомендовать хороший способ сделать это в хорошем состоянии.

Спасибо!

ответ

0

Поэтому основная идея была бы создать новый TreeMap (потому что вы упомянули, но я думаю, что LinkedHashMap должен быть достаточно), положите строку заголовка там, а затем все записи из списка ввода, со сдвинутыми индексы. более

Один совета, если вам не нужно GStrings, а затем использовать одиночные кавычки (') вместо двойных кавычек (")

Здесь, я взял немного времени, и сделал это из-за длительное время нет долбежные и я пропускаю этот великий язык немного:

List data = [  [name: "John", age: 21, gender: "male", option1: "test", option2: "test2"],  [name: "Doe", age: 23, gender: "male", option1: "", option2: "test2"],  [name: "Kate", age: 25, gender: "female", option1: "test", option2: ""],  [name: "Ann", age: 22, gender: "female", option1: "", option2: ""] ] 

def exportData = [ 1 : [ 'ID', 'name', 'age', 'gender', 'option1', 'option2' ] ] as TreeMap 

data.eachWithIndex { it, index -> exportData.put(index+2, [index+1]+it.values()) } 

println exportData​ 

Попробуйте его here.

+0

Спасибо вам так много! Только то, что мне нужно! –

0

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

@Grab('net.sourceforge.jexcelapi:jxl:2.6.12') 

import jxl.Workbook 
import jxl.write.WritableCell 
import jxl.write.Label 
import jxl.write.Number as NumericCell 

List data = [ 
    [name: "John", age: 21, gender: "male", option1: "test", option2: "test2"], 
    [name: "Doe", age: 23, gender: "male", option1: "", option2: "test2"], 
    [name: "Kate", age: 25, gender: "female", option1: "test", option2: ""], 
    [name: "Ann", age: 22, gender: "female", option1: "", option2: ""] 
] 

new FileOutputStream(new File('test.xls')).withStream {stream -> 
    def workbook = Workbook.createWorkbook(stream) 
    def sheet = workbook.createSheet('sheet name goes here', 0) 
    def cells = [] 

    // Create the header cells 
    use(ExcelWritableCellCategory) { 
     ['ID', 'name', 'age', 'gender', 'option1', 'option2'].eachWithIndex {name, column -> 
      cells << name.toCell(column, 0) 
     } 
    } 

    // Create the data cells 
    data.eachWithIndex {map, index -> 
     def row = index + 1 

     use(ExcelWritableCellCategory) { 
      cells << row.toCell(0, row) 

      ['name', 'age', 'gender', 'option1', 'option2'].eachWithIndex {key, column -> 
       cells << map[key].toCell(column + 1, row) 
      } 
     } 
    } 

    // Put the cells into the sheet 
    cells.each { sheet.addCell it }  
    workbook.write() 
    workbook.close() 
} 

class ExcelWritableCellCategory { 
    static WritableCell toCell(Number number, int column, int row) { 
     new NumericCell(column, row, number.toDouble()) 
    } 

    static WritableCell toCell(String string, int column, int row) { 
     new Label(column, row, string) 
    }  
} 

Подсказка: Я только что заметил некоторую избыточность в списке ключей; но это легко исправить.

0

Другим вариантом было бы создать список списков, предваряется имен заголовков:

List data = [ 
    [name: "John", age: 21, gender: "male", option1: "test", option2: "test2"], 
    [name: "Doe", age: 23, gender: "male", option1: "", option2: "test2"], 
    [name: "Kate", age: 25, gender: "female", option1: "test", option2: ""], 
    [name: "Ann", age: 22, gender: "female", option1: "", option2: ""] 
] 

List result = data[0].keySet().with { keys -> 
    data.inject([keys.toList()]) { curr, next -> 
     curr << keys.collect { next[it] } 
    } 
} 

assert result == [ 
    ['name', 'age', 'gender', 'option1', 'option2'], 
    ['John', 21, 'male', 'test', 'test2' ], 
    ['Doe', 23, 'male', '',  'test2' ], 
    ['Kate', 25, 'female', 'test', ''  ], 
    ['Ann', 22, 'female', '',  ''  ] 
]