2015-08-10 8 views
5

Ricevo uno List<org.apache.avro.generic.GenericRecord> con il contenuto dei dati come mostrato di seguito (notazione JSON utilizzata per chiarezza). Come posso mantenere al meglio questi tipi di record usando Java?Matrice di associazioni in Java

Notizia 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" 
    } 
    ] 

Come si può vedere qui, ogni serial number ha due record in record2. serial_no in record1 è uguale a id in record2.

Il mio obiettivo è: Il modo più veloce per trovare questi due record.

Soluzione Credo:

creare una mappa come

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

ma mi sento come, la sua una struttura complessa. Perché la mappa contiene un elenco di mappe [each map is Map<String,List<Map<String,String>>>].

Qualche suggerimento?

EDIT

Ogni voci nei record sono avro GenericRecord

+0

Un database sarebbe veloce. – Kayaman

+0

Perché è downvoted? Non hai ricevuto la 'nota di colore blu 'per specificare il motivo? –

risposta

4

Sembra come se si sta cercando di analizzare JSON utilizzando Java. Perché non usare una libreria specifica per questo? Come il numero di base http://www.json.org/java/ o Google https://github.com/google/gson

Altrimenti, non penso che la struttura complessa che stai proponendo sia particolarmente lenta. Si potrebbe voler progettare la propria classe di oggetti per contenere i dati se si ritiene che sia più efficiente o più facile ottenere i dati.


EDIT

In base alla tua domanda ho pensato JSON stato il formato è stato ricevuto in, mi dispiace.

Vorrei solo creare un wrapper per GenericRecord o sottoclasse esso. Quindi aggiungere i metodi necessari per estrarre i dati o renderlo Comparable per l'ordinamento.

Qualcosa sulla falsariga di

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' ha due metodi in overload' toJson', 'fromJson'. Né è utile nel mio caso. Puoi per favore elaborare di più? –

+0

Ricevi i dati come effettivi JSON? – mvreijn

+0

No. È la lista di [GenericRecord] (http://avro.apache.org/docs/1.6.2/api/java/org/apache/avro/generic/GenericData.Record.html) –

1

Definire class es per le voci ricorrenti:

class SerialNoData { 
    String serialNo; 
    Object data; 
} 

e

class IdType { 
    String id; 
    String type; 
} 

; una volta analizzato mettere le istanze in matrici o List s per ottenere il formato desiderato.

+0

Si potrebbe preferire comunque serialNo. –

+0

Preferisco questa risposta e lasciami provare. –

0

La complessità della mappa non fa davvero la differenza per la velocità. A seconda del tipo di mappa che si utilizza ottenere un elenco di record sarà tempo costante (con un overhead ragionevolmente piccolo). Trovare qualcosa nelle sottoliste sarà quindi O (n), dal momento che è necessario scorrere l'elenco e guardare tutte le mappe.

+0

Nessun uomo. Ho bisogno di tutti i dati sulla mappa. Posso filtrarlo per la prima volta. Quindi sarebbe solo un ciclo for allora O (1) per tutte le operazioni get –

+0

Quindi non dovresti preoccuparti della velocità. Anche con 10 milioni di voci, la ricerca di una mappa hash richiede meno di un decimo di millisecondo. – Astrogat

0

Definire seguenti classi

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

class IdType{ 
String id; 
String type; 
} 

Dopo di che è possibile utilizzare Jackson o qualsiasi tipo di libreria di elaborazione JSON.

+0

'' serial-no'' non è un identificatore valido, e cosa c'è '' Lista idTypes'' per? –

+0

Ogni record 1 ha più record 2. Ecco perché ho usato Elenco per contenere i record2. Non ho capito "seriale-no non è un identificatore valido". –

+0

L'autore significa che due corrispondenti "IdType'' strutture possono essere cercate con il numero seriale da' 'Serial''. Non puoi inserire "-" nei nomi delle variabili, vedi [Identificatori] (https://docs.oracle.com/cd/E19798-01/821-1841/bnbuk/index.html) –