2011-10-27 14 views
5

¿Utiliza Java, que es la mejor manera de combinar dos matrices de clase según algún valor de la clase?La mejor manera de combinar dos matrices de clases según el valor de variable de clase

ejemplo, tenemos estas dos clases:

public class C1{ 
    public String id=""; 
    public String value=""; 
    public String tot=""; 
} 

public Class C2{ 
public String id=""; 
public String tot=""; 
} 

Y en algún punto de nuestro código tenemos dos matrices como:

  //id -value - tot 
C1 a [] = { {"1","value#1",""}, 
      {"2","value#2",""}, 
      {"3","value#3",""}, 
      {"4","value#4",""} 
    }; 
       //id - tot 
    C2 b [] = { {"1","2"}, 
       {"2","11"}, 
       {"4","15"} 
}; 

La matriz final debe ser similar:

C1 f [] = { {"1","value#1","2"}, 
      {"2","value#2","11"}, 
      {"3","value#3",""}, 
      {"4","value#4","15"} 
}; 

Estoy tratando de encontrar la mejor manera de lograr este resultado sin leer una u otra matriz desde el inicio hasta fin, porque aquí las dos matrices tienen pocas filas, pero en realidad ambas pueden tener una longitud de 100k + ...

+2

Ordene las matrices con la tecla. Vaya a través de las matrices aumentando la clave, comparando para ver si coinciden, y si lo hacen, utilice la reflexión para copiar todos los atributos de C2 a C1. – bdares

+0

El comentario anterior es una buena solución, pero creo que el reflejo es excesivo a menos que por alguna razón no sepa qué campos deben copiarse en tiempo de compilación. –

Respuesta

2

Ponga una matriz en Map<String, C1> donde la clave es id. Itere a través de la otra matriz buscando el id en el mapa y actualizando el valor. Si usa un TreeHashMap, puede recuperar los valores en orden por las teclas.

0

Esto suena como un ejemplo de libro de texto de algo que harías distribuido con hadoop y map-reduce . Dependiendo de cuál sea su nivel de ambición y su presupuesto (y cuán crítica es esta operación), podría valer la pena examinarlo.

0

Esto es algo que los motores de base de datos están haciendo para vivir. Veamos cómo lo hacen: a) para unir un conjunto de datos muy pequeño con otro, se utilizan ciclos anidados. Es la forma menos eficiente.
b) Si un conjunto es lo suficientemente pequeño como para caber en la memoria, puede ponerlo como pares clave-valor en el hashmap y luego hacer una ruta sobre un conjunto de datos más pequeño para encontrar todas las coincidencias.
c) Si las matrices están ordenadas por clave, puede hacer una fusión-ordenar la unión. Simplemente sobrepasa ambos conjuntos de datos y busca las coincidencias. Si una matriz ya está ordenada, puede tener sentido ordenar la segunda y luego usar este algoritmo.
d) Si ambos conjuntos de datos son demasiado grandes para caber en una memoria, puede usar la combinación de hash de gracia. Divides ambos conjuntos de datos en X segmentos haciendo un hash de su clave de combinación. Si usa la misma función hash, puede estar seguro de que solo tiene que unirse a los cubos correspondientes. Luego, usa cualquiera de las técnicas anteriores para unir cubos.
e) Hadoop y mapa/Reducir es una buena opción, si realmente tiene grandes conjuntos de datos. Internamente ordenará ambos conjuntos de datos y luego le permitirá hacer la unión.
f) Puede tomar Hadoop con Hive, simplemente ponga los datos en su tabla y permita que se una. Veo esta opción como la más práctica para grandes volúmenes de datos.

Cuestiones relacionadas