Cómo usar la marca de tiempo en un mapa como clave

Estoy trabajando en un desafío de codificación en una aplicación bancaria donde necesito obtener el número de transacciones en los últimos 60 segundos. Para eso estoy usando java.sql.Timestampcomo una clave mapsimilar a continuación:

Map<Timestamp, List<Transaction>> transactions1 = new HashMap<>();

Aquí el valor es la lista de transacciones realizadas en ese momento. No puedo usar DB . Sé cómo iterar a través del mapa y buscar los datos, pero para eso necesito iterar todo, lo mapque llevará mucho tiempo.

1) Mi pregunta es ¿cuál es Mapla estructura de datos correcta para este problema?

2) Si es así, ¿cómo puedo reducirlo (puede ser por NavigableMap)?

No solicito una solución de codificación, sino la estructura de diseño / datos adecuada que debería usar.

Respuesta 1

Un HashMap solo considera el mapeo (basado en el código hash y la igualdad).

Esto significa: debe usar get() todas las teclas de su mapa para asegurarse de identificarlas correctamente dentro de cierto intervalo. No hay accesos directos posibles, siempre una exploración completa de O (n) de todas las teclas en su mapa.

Por lo tanto, tiene razón: cualquier estrategia eficiente debe permitirle buscar ese mapa (en un enfoque basado en una matriz / acceso aleatorio), por lo que los mapas que implementan NavigableMap, como TreeMap , serán una mejor opción. Los TreeMaps también están ordenados, por lo que podría implementar alguna forma de "búsqueda binaria" para identificar marcas de tiempo de los últimos n segundos. Significado: necesita O (log n) para determinar la primera marca de tiempo dentro del intervalo, y luego sigue buscando las siguientes teclas, hasta llegar al límite superior del intervalo.

Más allá de eso, podría ser útil invertir en su propia implementación de algún tipo de índice . Como una lista que recuerda la primera marca de tiempo de intervalos de 1/5 / n minutos.

Significado: la fruta baja es simplemente cambiar de HashMap a TreeMap, con una búsqueda inteligente de límites de intervalo. Pero para un escenario del "mundo real", donde es posible que tenga que lidiar con cientos de miles o millones de entradas, ese enfoque aún no es suficiente. Entonces tendría que diseñar con mucho cuidado una solución que optimice sus requisitos más importantes. Pero eso es algo que solo tú puedes hacer.

Respuesta: 2

Estamos utilizando CVS para alrededor de 50 proyectos java que desarrollamos con Eclipse y construimos con Hudson. Ahora hemos llegado al punto en el que queremos migrar a algo mejor, y estoy considerando ...

Tengo las siguientes líneas de código Java: Object [] results = api.getProjects (); for (int i = 0; i <results.length; i ++) {System.out.println (results [i] .toString ()); } Y aquí está el ...

Estoy usando com.ctc.wstx.stax.WstxOutputFactory para generar XML. Estoy ejecutando wstx-asl-3.2.4. Necesito comenzar a validar el XML generado contra un esquema W3. Cuando creo una instancia de org ...

¿Alguien puede explicar el siguiente código de String.java, específicamente por qué hay tres declaraciones if (que he marcado // 1, // 2 y // 3)? clase estática privada CaseInsensitiveComparator ...