Преобразование дерева объектов Java в двухмерную таблицу

Я столкнулся со следующей проблемой. У меня есть дерево объектов Java, для которых я должен экспортировать каждое значение поля в файл CSV. Результат экспорта должен быть похож на то, что у нас есть в SQL левое внешнее соединение (называемое декартовым произведением).

Автор класса

@DataField(pos = 1)
String firstName;

@DataField(pos = 2)
String lastName;

@OneToMany
List<Book> books;

@OneToMany
List<Editor> editors;

@DataField(pos = 7)
String Age;

Учебник

@DataField(pos = 3)
String title;

@DataField(pos = 4)
String year;

@OneToMany
List<Reference> references;

Ссылка на класс

@DataField(pos = 5)
String type;

@DataField(pos = 6)
String code;

Редактор классов

@DataField(pos = 8)
String name;

Примечания: - Аннотация @DataField указывает положение значения в записи CSV. - В этом примере у нас есть один объект Author (Charles, Moulliard), содержащий список из 2 книг («Верблюд в действии» и «Верблюд в действии 2») . Первая книга имеет три ссылки (ISBN 1234, ISBN 5678, ISBN 999), а вторая — одну ссылку (ISBB 1111). Автор содержит также список двух редакторов ("manning", "manning 2")

Вот пример и желаемый результат

«Имя», «Фамилия», «Возраст», «Название», «Год», «Тип», «Код», «Имя» «Чарльз», «Муллиард», «Верблюд в действии», «2009», « ISBN», «1234», «укомплектование», «43», «Чарльз», «мульярд», «верблюд в действии», «2009», «ISBN», «1234», «укомплектование 2», «43», «Чарльз ","мульярд","верблюд в действии","2009","ISBN","5678","укомплектование","43" "чарльз","мульярд","верблюд в действии","2009"," ISBN", "5678", "укомплектование 2", "43" "Чарльз", "мульярд", "верблюд в действии", "2009", "ISBN", "9999", "укомплектование", "43" "Чарльз ","мульярд","верблюд в действии","2009","ISBN","9999","укомплектование 2","43" "чарльз","мульярд","верблюд в действии 2","2011" ,"ISBB","1111","укомплектование","43" "Чарльз","мульярд","верблюд в действии 2","2011","ISBB","1111","укомплектование 2","43 "

Я попытался использовать рекурсивную функцию для помещения значений поля в Map of LinkedList: Map, где Integer = положение поля в CSV и Linkedlist = список объектов, но я потерял информацию о положении элемента в дереве.

С уважением,

Чарльз


person cmoulliard    schedule 15.10.2009    source источник
comment
не могли бы вы показать код, который вы пробовали? Это даст немного больше понимания, в чем проблема   -  person Toad    schedule 15.10.2009
comment
Код больше 600 символов.   -  person cmoulliard    schedule 15.10.2009
comment
Значения Map‹Integer, List› = new HashMap‹Integer, List›(); values.put(1, Arrays.asList(Чарльз)); values.put(2, Arrays.asList(Moulliard)); values.put(3, Arrays.asList(Верблюд в действии, Верблюд в действии 2)); values.put(4, Arrays.asList(2009, 2011)); values.put(5, Arrays.asList(ISBN, ISBN, ISBN)); values.put(6, Arrays.asList(1234, 9876, 7777));   -  person cmoulliard    schedule 15.10.2009
comment
Я добавил код в качестве ответа. Как видите, данные помещаются в таблицу, но мы потеряли навигацию по дереву. Так что, вероятно, мы должны создать карту по-другому (чтобы сохранить информацию о навигации по дереву, которую мы будем использовать позже для построения таблицы в 2 измерениях)   -  person cmoulliard    schedule 15.10.2009


Ответы (1)


Я, наверное, не понимаю вашей проблемы. Что-то вроде этого не сработает?

ArrayList<ArrayList<String>> table = new ArrayList<ArrayList<String>>();
for (Author author:authors) {
    for (Book book:author.getBooks()) {
        for (Reference reference:book.getReferences()){
            for (Editor editor:editors) {
                table.add(new ArrayList<String>(Arrays.toList({author.getFirstName(), 
                                            author.getLastName(), 
                                            book.getTitle(), 
                                            book.getYear(), 
                                            reference.getType(), 
                                            reference.getCode(), 
                                            editor.getName()})
                                    );
                );
            }
        }
    }
}
person HerdplattenToni    schedule 15.10.2009