2009-10-15 16 views
1

Je suis confronté au problème suivant. J'ai un arbre de Java pour lequel je dois exporter chaque valeur de champ dans un fichier CSV. Le résultat de l'exportation doit être similaire à ce que nous avons dans la jointure externe gauche SQL (appelée produit cartésien).Transforme un arbre d'objets java en un tableau de dimension 2

auteur classe

@DataField(pos = 1) 
String firstName; 

@DataField(pos = 2) 
String lastName; 

@OneToMany 
List<Book> books; 

@OneToMany 
List<Editor> editors; 

@DataField(pos = 7) 
String Age; 

classe Livre

@DataField(pos = 3) 
String title; 

@DataField(pos = 4) 
String year; 

@OneToMany 
List<Reference> references; 

Référence de la classe

@DataField(pos = 5) 
String type; 

@DataField(pos = 6) 
String code; 

classe Editor

@DataField(pos = 8) 
String name; 

Remarques: - L'annotation @DataField indique la position de la valeur dans l'enregistrement CSV - Pour cet exemple, nous avons un objet Author (Charles, Moulliard) contenant une liste de 2 livres ("Camel in action" et "Camel in action 2 "). Le premier livre a trois références (ISBN 1234, ISBN 5678, ISBN 999) et la deuxième référence (ISBB 1111). Auteur contient également une liste de deux rédacteurs en chef ("équipage", "manning 2")

Voici un exemple et le résultat voulu

"prenom", "lastName", "âge", "title", "année", "type", "code", "nom" "charles", "moulliard", "chameau en action", "2009", "ISBN", "1234", "manning", "43" "charles", "moulliard", "chameau en action", "2009", "ISBN", "1234", "manning 2", "43" "charles", "moulliard", "chameau en action", " 2009 "," ISBN "," 5678 "," manning "," 43 " " charles "," moulliard "," chameau en action "," 2009 "," ISBN "," 5678 "," manning 2 ", "43" "charles", "moulliard", "chameau en action", "2009", "ISBN", "9999", "manning", "43" "charle s "," moulliard "," chameau en action "," 2009 "," ISBN "," 9999 "," manning 2 "," 43 " " charles "," moulliard "," chameau en action 2 "," 2011 "," ISBB "," 1111 "," manning "," 43 " " charles "," moulliard "," chameau en action 2 "," 2011 "," ISBB "," 1111 "," manning 2 " , "43"

J'ai essayé d'utiliser une fonction récursive pour mettre des valeurs de champs dans Map of LinkedList: Map où Integer = position du champ dans la liste CSV et Linkedlist = mais j'ai perdu des informations sur la position de l'élément dans l'arbre.

Cordialement,

Charles

+0

pourrait vous montrer le code que vous avez essayé? Il donnera un peu plus de perspicacité où le problème réside – Toad

+0

Le code est plus grand que 600 caractères. – cmoulliard

+0

Carte values ​​= new HashMap (); values.put (1, Arrays.asList ("Charles")); values.put (2, Arrays.asList ("Moulliard")); values.put (3, Arrays.asList ("Chameau en action", "Chameau en action 2")); values.put (4, Arrays.asList ("2009", "2011")); values.put (5, Arrays.asList ("ISBN", "ISBN", "ISBN")); values.put (6, tableaux.asList ("1234", "9876", "7777")); – cmoulliard

Répondre

1

Je ne comprend probablement pas votre problème. Est-ce que quelque chose comme ça ne fonctionnerait pas?

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()}) 
            ); 
       ); 
      } 
     } 
    } 
} 
0
 Map<Integer, List> values = new HashMap<Integer, List>(); 
    values.put(1, Arrays.asList("Charles")); 
    values.put(2, Arrays.asList("Moulliard")); 
    values.put(3, Arrays.asList("Camel in Action", "Camel in Action 2")); 
    values.put(4, Arrays.asList("2009", "2011")); 
    values.put(5, Arrays.asList("ISBN", "ISBN", "ISBN")); 
    values.put(6, Arrays.asList("1234", "9876", "7777")); 
    for (List l : s.product(values)) { 
     System.out.println(l); 
    } 



} 

public List<List> product(Map<Integer, List> values) { 

     List<List> product = new ArrayList<List>(); 
     Map<Integer, Integer> index = new HashMap<Integer, Integer>(); 
     boolean incIndex = false; 

     while (!incIndex) { 

      incIndex = true; 
      List v = new ArrayList(); 

      for (int i = 1; ; i++) { 
       List l = values.get(i); 
       if (l == null) { 
        break; 
       } 
       int idx = 0; 
       if (index.containsKey(i)) { 
        idx = index.get(i); 
       } 
       v.add(l.get(idx)); 
       if (incIndex) { 
        if (++idx >= l.size()) { 
         idx = 0; 
        } else { 
         incIndex = false; 
        } 
        index.put(i, idx); 
       } 
      } 
      product.add(v); 
     } 
     return product; 
}