2017-02-16 3 views
0

У меня есть файл конфигурации, чтобы указать поля для извлечения из документа JSON, которые я затем хочу записать в файл CSV.Сортировка карты по заданному порядку ключей в Groovy

На данный момент я повторяю документ JSON и назначая указанные ключи и значения HashMap<String,Object>, а затем добавляя их к ArrayList<HashMap<String,Object>>. Кажется, что карта заполняется, поскольку информация считывается из документа JSON.

Как я могу сортировать свои карты в порядке, указанном в файле конфигурации? Я искал в Интернете, но только нашел примеры, как сортировать по алфавиту или численно, что не то, что я хочу.

Конфигурация: "useFields":["id","created","subject","status","priority"]

Токовый выход: ["created:16-Feb-2017, id:1234, priority:low, status:Foo, subject:Bar"]

Желаемый результат: ["id:1234, created:16-Feb-2017, subject:Bar, status:Foo, priority:low"]

+0

Вместо HashMap, посмотрите на ListOrderedMap от общих -наборов: http://commons.apache.org/proper/commons-collections/apidocs/org/apache/commons/collections4/map/ListOrderedMap.html – bdkosher

+0

Спасибо. Поэтому я предполагаю, что я должен перебирать настроенные поля, захватывать содержимое из JSON с помощью этого ключа, а затем добавлять его в ListOrderedMap? Я сделаю это! – Donglecow

+0

Стандартная Java 'LinkedHashMap' обеспечивает ту же функциональность, И это класс, используемый литералами карт в Groovy. попробуйте то же, что и вы предложили выше, но просто запустите вторую карту с помощью '[:]'. Он должен заказывать ключи точно как вставленные. – BalRog

ответ

0

Стандартный класс Java LinkedHashMap сортирует карта записи в порядке их добавления. И, как оказалось, фактический объект, созданный при использовании синтаксиса Groovy «map literal», фактически равен LinkedHashMap. Таким образом, получить эффект, который вы хотите так же просто, как создание пустой карты буквальной и добавление записей из существующей карты в порядке желаемому:

final useFields = ["id","created","subject","status","priority"] 

def input = [created:"16-Feb-2017", id:1234, priority:"low", status:"Foo", subject:"Bar"] 
println input 

def output = [:] 
useFields.each { output[it] = input[it] } 
// or this one-liner: 
// def output = useFields.inject([:]) { out, key -> out[key] = input[key]; out } 
println output 
+0

Спасибо, что указали это. Это работает, как вы описали, хотя я думаю, что нашел более эффективный способ памяти для достижения того, что мне нужно, в более поздней точке моей программы, где мне не нужно создавать несколько экземпляров карт. – Donglecow

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