¿Qué estructura / solución de datos Java se ajusta mejor a estos requisitos?

Necesito una estructura / solución de datos java que cumpla con estos requisitos. ¿Qué se adapta mejor a estos?

1) El orden de inserción del objeto debe mantenerse

2) Los objetos deben ser únicos (estos son objetos de base de datos que se identifican de forma exclusiva por un UUID).

3) Si se agrega un objeto más nuevo con la misma ID, la versión anterior del objeto debe sobrescribirse / eliminarse

4) La solución debe ser accesible por muchos hilos.

5) Cuando el primer objeto agregado a la Estructura se lee / usa, debe eliminarse de la estructura de datos

Respuesta 1

Mi pensamiento es algo como lo siguiente:

 Collections.synchronizedMap(new LinkedHashMap<K, V>());

Creo que eso se encarga de todo, excepto el requisito 5, pero puede hacerlo utilizando el remove()método en lugar de get().

Esto no será tan eficiente como ConcurrentMaplo sería: la sincronización bloquea todo el mapa en cada acceso, pero creo que las ConncurrentMapimplementaciones pueden usar bloqueos de lectura-escritura y bloqueo selectivo en solo una parte del mapa para permitir que se accedan múltiples accesos no conflictivos encendido simultáneamente Si lo desea, probablemente podría obtener un mejor rendimiento escribiendo su propia subclase de alguna Mapimplementación existente .

Respuesta: 2

1) El orden de inserción del objeto debe mantenerse

Esta es cualquier estructura de datos "normal": array, arrayList, tree. Por lo tanto, evite las estructuras de datos de autoequilibrio o de clasificación automática: montones, tablas hash o árboles de mover hacia adelante (árboles de separación, por ejemplo). Por otra parte, podría usar una de esas estructuras, pero luego debe realizar un seguimiento de su orden de inserción en cada nodo.

2) Los objetos deben ser únicos (estos son objetos de base de datos que se identifican de forma exclusiva por un UUID).

Mantenga un identificador único asociado con cada objeto. Si este es un programa en C, entonces el puntero a ese nodo es único (supongo que esto también se aplica en Java). Si el puntero del nodo no es suficiente para mantener la "unicidad", entonces necesita agregar un campo a cada nodo que Usted garantiza tener un valor único.

3) Si se agrega un objeto más nuevo con la misma ID, la versión anterior del objeto debe sobrescribirse / eliminarse

¿Dónde quieres colocar el nodo? ¿Desea reemplazar el nodo existente? ¿O desea eliminar el nodo anterior y luego agregar el nuevo al final? Esto es importante porque está relacionado con su requisito n. ° 1, donde se debe preservar el orden de inserción.

4) La solución debe ser accesible por muchos hilos.

La única forma en que se me ocurre hacer esto es implementar algún tipo de bloqueo. Java le permite envolver estructuras y código dentro de un synchronizedbloque.

5) Cuando el primer objeto agregado a la Estructura se lee / usa, debe eliminarse de la estructura de datos

Un poco como una operación "dequeue".

Parece que una ArrayList es una muy buena opción para esto: simplemente por el n. ° 5. El único problema es que las búsquedas son lineales. Pero si tiene una cantidad relativamente pequeña de datos, entonces no es realmente un gran problema.

De lo contrario, como otros han dicho: un HashMap o incluso un Árbol de algún tipo funcionaría, pero eso dependerá de la frecuencia de los accesos. (Por ejemplo, si es probable que se acceda al elemento "más reciente", usaría una estructura lineal. Pero si los accesos serán de elementos "aleatorios", iría con un HashMap o un Árbol).

Respuesta: 3

Las soluciones que hablan sobre LinkedHashSet serían un buen punto de partida.

Sin embargo, tendría que anular los métodos equals y hashcode en los objetos que colocará en el conjunto para satisfacer su requisito número 3.

Respuesta: 4

¿Por qué puedo tener un método para recibir una lista con comodines: public processGenerics (List <? Extend User> users) {...} pero no puedo crear una instancia de esa misma Lista de manera similar? Lista <? se extiende ...

Quiero ordenar Collection of Objects, que no implementa una interfaz comparable o de comparación. El problema es que no puedo cambiar el diseño de la clase porque solo tengo un archivo .class (sin código fuente). Cómo ...

¿Existe un complemento de Maven que generará automáticamente setters y getters con los JavaDocs correspondientes? Soy consciente de que Eclipse / Netbeans hará esto cuando se lo pidas; sin embargo, sería ...

Me preguntaba qué tan caros son los algoritmos de conversión de codificación de cadenas de Java, por ejemplo, para un fragmento de texto en EBCDIC que debe convertirse a UTF-16, o para una conversión similar de un archivo grande. ...