2015-08-10 6 views
5

Ich erhalte eine List<org.apache.avro.generic.GenericRecord> mit den Daten Inhalt wie unten gezeigt (JSON Notation für die Übersichtlichkeit verwendet). Wie kann ich diese Datensatztypen am besten mit Java verwalten?Assoziativität Array in Java

Aufnahme 1:

[ 
    { 
     "serial_no" : "x", 
     "data1" : "d" 
    }, 
    { 
    "serial_no" : "y", 
    "data2" : "d2" 
    }, 
    ............................MANY MORE 
    ] 

Record 2:

[ 
    { 
     "id":"x", 
     "type":"A" 
    }, 
    { 
     "id" : "x", 
     "type" : "B" 
    }, 
    { 
     "id" : "y", 
     "type" : "A", 
    }, 
    { 
     "id" : "y", 
     "type" : "B" 
    } 
    ] 

Wie Sie hier sehen, jede serial number zwei Datensätze in record2 hat. serial_no in Datensatz1 ist identisch mit id in Datensatz2.

Mein Ziel ist: Fatseste Weg, diese beiden Datensätze zu finden.

Lösung Ich denke:

Erstellen Sie eine Karte wie

 map.put("x", [map.put("A",List), map.put("B",List)]); 

Aber ich fühle mich wie, seine eine komplexe Struktur. Weil die Karte eine Liste von Karten enthält [each map is Map<String,List<Map<String,String>>>].

Irgendwelche Vorschläge?

EDIT

Jede Einträge in Aufzeichnungen avro GenericRecord

+0

Eine Datenbank wäre schnell. – Kayaman

+0

Warum wird es abgelehnt? Haben Sie nicht eine blaue Farbnotiz erhalten, um den Grund anzugeben? –

Antwort

4

sind es aussieht, als ob Sie JSON mit Java zu analysieren versuchen. Warum nicht eine bestimmte Bibliothek dafür verwenden? Wie die Basis http://www.json.org/java/ oder https://github.com/google/gson von Google

Sonst denke ich nicht, dass die komplexe Struktur, die Sie vorschlagen, besonders langsam ist. Vielleicht möchten Sie Ihre eigene Objektklasse entwerfen, um die Daten zu speichern, wenn Sie denken, dass es effizienter oder einfacher ist, zu den Daten zu gelangen.


EDIT

auf Ihre Frage Basierend ging ich davon aus JSON war das Format, das Sie es in erhalten, sorry.

Ich würde nur einen Wrapper für GenericRecord erstellen, oder Unterklasse es. Fügen Sie dann die Methoden hinzu, die Sie zum Extrahieren der Daten benötigen, oder geben Sie Comparable zum Sortieren ein.

Etwas nach dem Vorbild von

public class MyRecord extends GenericRecord implements Comparable<MyRecord> 
{ 
    // Determine the type 
    public int getType() 
    { 
     if (this.get("id") != null) 
      return 2; 
     return 1; 
    } 
    // Add methods that allow you to retrieve the serial field from any of the two record types 
    public String getId() 
    { 
     if (this.get("id") != null) 
      return (String)this.get("id"); 
     return (String)this.get("serial_no"); 
    } 

    // add comparator methods that will allow you to sort the list, compare based on Id, etc 
    @Override 
    public int compareTo(MyRecord another) 
    { 
     // Just a simple example 
     return this.getId().compareTo(another.getId()); 
    } 
} 
+0

'gson' hat zwei überladene Methoden' toJson', 'fromJson'. Beides ist in meinem Fall nicht nützlich. Kannst du bitte mehr ausarbeiten? –

+0

Erhalten Sie die Daten als tatsächliches JSON? – mvreijn

+0

Nein. Es ist eine Liste von [GenericRecord] (http://avro.apache.org/docs/1.6.2/api/java/org/apache/avro/generic/GenericData.Record.html) –

1

definieren class es für wiederholte Einträge:

class SerialNoData { 
    String serialNo; 
    Object data; 
} 

und

class IdType { 
    String id; 
    String type; 
} 

; Sobald geparst, setzen Sie die Instanzen in Arrays oder List s, um das gewünschte Format zu erhalten.

+0

Sie möchten vielleicht serialNo obwohl bevorzugen. –

+0

Ich bevorzuge diese Antwort und lass es mich versuchen. –

0

Wie komplex die Karte ist, macht keinen wirklichen Unterschied für die Geschwindigkeit. Abhängig von der Art der Map, die Sie verwenden, um eine Liste von Datensätzen zu erhalten, wird die Konstante Zeit (mit einem relativ geringen Overhead) sein. Etwas in den Unterlisten zu finden, ist dann O (n), da Sie die Liste durchlaufen und alle Maps betrachten müssen.

+0

Kein Mann. Ich brauche alle Daten in der Karte. Ich kann es zum ersten Mal filtern. Also wäre es nur eine für die Schleife, dann O (1) für alle Operationen. –

+0

Dann sollten Sie sich wirklich keine Gedanken über die Geschwindigkeit machen. Selbst bei 10 Millionen Einträgen dauert ein Hash-Map-Look-up weniger als ein Zehntel einer Millisekunde. – Astrogat

0

definieren folgende Klassen

class Serial{ 
String serial-no; 
String data; 
List<IdType> idTypes; 
} 

class IdType{ 
String id; 
String type; 
} 

Danach Sie jackson oder irgendeine Art von JSON Verarbeitungs-Bibliothek verwenden können.

+0

'' serial-no'' ist kein gültiger Bezeichner, und was ist '' List idTypes'' für? –

+0

Jeder Datensatz 1 hat mehrere Datensätze. Deshalb habe ich List verwendet, um Datensätze2 zu enthalten. Ich habe nicht verstanden "serial-no ist kein gültiger Bezeichner". –

+0

Der Autor bedeutet, dass zwei entsprechende "IdType" -Strukturen mit der Seriennummer von '' Serial'' gesucht werden können. Sie können nicht "-" in Variablennamen setzen, siehe [Bezeichner] (https://docs.oracle.com/cd/E19798-01/821-1841/bnbuk/index.html) –