2016-10-24 9 views
4

Ich habe Mühe, die richtige Logik zu erstellen, um ein Array zu glätten. Ich möchte im Wesentlichen Elternzeilen für jedes untergeordnete Element in einem verschachtelten Array duplizieren. Die Anzahl der verschachtelten Arrays kann variieren. Ich habe Java-Listen erstellt. Ich finde es einfach, mit ihnen zu arbeiten, aber offen für jede Lösung. Die Natur dieses Problems ist, dass ich mit etwas verschachteltem JSON anfange, das ich in einen flachen csv umwandeln möchte, um in eine Datenbanktabelle zu laden. Danke für die Hilfe.Verschachtelte Arrays abflachen. (Java)

Beispiel:

[1,2,[A,B,[Cat,Dog]],3] 

Ich habe die oben als eine Liste erstellt. Jedes Element ist entweder eine Zeichenfolge oder eine andere Liste.

Ergebnis:

[1,2,A,Cat,3], 
[1,2,A,Dog,3], 
[1,2,B,Cat,3], 
[1,2,B,Dog,3] 

Hier ist, was ich bisher haben. Offensichtlich nicht funktioniert.

private static List<List<String>> processData(List<String> row, List<Object> data, List<List<String>> rowList) { 
    List<List<String>> tempRowList = new ArrayList<List<String>>(); 
    for (Object i : data) { 
     if (i instanceof List<?>) { 
      flattenArray((List<Object>) i, row, rowList); 
     } else { 
      for (List<String> r : rowList) { 
       r.add(i.toString()); //add item to all rows 
      } 
     } 
    } 
    return rowList; 

private static void flattenArray(List<Object> arrayObject, List<String> rowToCopy, List<List<String>> rowList) { 

    for (Object x : arrayObject) { 

     if (x instanceof List<?>) { 
      for (List<String> t : rowList) { 
       flattenArray((List<Object>) x, t, rowList); 
      } 

     } else { 
      List<String> newRow = new ArrayList<String>(rowToCopy); //copy row 

      List<Object> t = new ArrayList<Object>(); 
      t.add(x); 

      List<List<String>> innerRowList = new ArrayList<List<String>>(); 
      innerRowList.add(newRow); 

      processData(newRow, t, innerRowList); //pass in new copied row. object to add, 
      rowList.add(newRow); 

     } 

    } 
    rowList.remove(rowToCopy); 
} 

Und ich habe alles so eingerichtet.

public static void main(String[] args) { 

    List<Object> data = new ArrayList<Object>(); 
    List<List<String>> rowList = new ArrayList<List<String>>(); 

    data.add("1"); 
    data.add("2"); 

    List<Object> l1 = new ArrayList<Object>(); 
    l1.add("A"); 
    l1.add("B");   
    List<Object> l2 = new ArrayList<Object>(); 
    l2.add("dog"); 
    l2.add("cat"); 
    l1.add(l2); 
    data.add(l1); 

    data.add("3"); 

    List<String> r0 = new ArrayList<String>(); 
    rowList.add(r0); 
    System.out.println(data); 
    rowList = processData(r0, data, rowList); 
    System.out.println(rowList); 
} 
+1

Welchen Code haben Sie geschrieben? Mal sehen? – Ash

+1

ok, habe meinen Code hinzugefügt. Ich habe das Gefühl, dass ich das viel zu kompliziert gemacht habe. – Andrew

+0

Das ist in Ordnung, jetzt können wir helfen, durch welche Probleme Sie gehen – Ash

Antwort

2

Ich denke, das sollte für Sie arbeiten, wenn Sie Java 8 verwenden sind:

wird
List<Object> a = new ArrayList<>(); 
    List<Object> a1 = new ArrayList<>(); 
    a1.add("v"); 
    a1.add("w"); 
    List<Object> a2 = new ArrayList<>(); 
    a2.add("ww"); 
    a.add("a"); 
    a.add("b"); 
    a.add("c"); 
    a.add("d"); 
    a.add(a1); 
    a.add(a2); 
    List<Object> b = new ArrayList<>(); 

    a.stream().flatMap(x -> x instanceof String ? Stream.of(x) : ((List) x).stream()).forEach(b::add); 

    System.out.println(a); 
    System.out.println(b); 

b Liste a Liste abgeflacht enthalten. Ausgabe ist:

[a, b, c, d, [v, w], [ww]] 
[a, b, c, d, v, w, ww] 
+0

Ich benutze Java 8. Ich habe nur ein wenig mit Streams gespielt. War neugierig, ob sie mir hier helfen könnten. – Andrew

+0

Ich bin mir nicht sicher, wie man sie verwendet, basierend auf Ihrem Beispiel. – Andrew

+0

[Andrew] (http://stackoverflow.com/users/6210427/andrew) sollte dies funktionieren. Ich weiß, es ist hässlich, ich werde versuchen, es so schnell wie möglich zu verschönern. – GROX13