Necesita un mapa de hash ordenado por valor donde el valor es el estado cambia constantemente

Necesito una solución de mapa de hash en la que la clave sea un objeto de inversor que sea único y el valor sea un objeto de cartera.

El problema es que necesito que los inversores sean clasificados por su objeto de cartera, que tiene un valor total en su interior, que cambia constantemente a medida que compra / vende acciones.

¿Cómo se puede solucionar este problema? ¡Gracias!

preguntado el 08 de noviembre de 11 a las 10:11

En realidad, no creo que lo anterior funcione bien, ya que creo que TreeMap solo se ordena en la inserción. -

Entonces, ¿cómo necesita obtener las carteras? ¿Solo necesita obtener una lista ordenada de carteras o necesita iterar el mapa (clave y valor) en orden por valor de cartera? -

Por el momento, solo necesito saber quién es mi principal inversor con el mayor valor de cartera. Por lo tanto, necesito el mapa ordenado ....

Dado eso, creo que hacer algo similar a una combinación de publicación de Anish y mi respuesta es probablemente la mejor. Cree un método que clasifique los valores (o entradas) en el Mapa y devuelva la lista ordenada (SortedSet) o la primera / última entrada. Solo asegúrese de que los datos no cambien durante el proceso de clasificación. ;) -

3 Respuestas

Dependiendo de sus requisitos, creo que la mejor solución es almacenar los valores en un estándar. Map pero proporcione un método para poner las carteras en orden ImmutableSortedSet<Portfolio> getSortedPortfolios(). El método obtendría la lista de valores y los pondría en el Set. Esto supone que Portfolios implements Comparable de lo contrario, deberá proporcionar un Comparator.

ImmutableSortedSet<Portfolio> getSortedPortfolios(){
   return ImmutableSortedSet.builder()
             .addAll(myMap.getValues())
             .build();
}

Si realmente necesita seguridad para subprocesos, le recomendaría usar un constructor de copias para crear instantáneas e insertarlas. Esto garantizaría que la lista ordenada devuelta permanezca ordenada.

ImmutableSortedSet<Portfolio> getSortedPortfolios(){
   ImmutableSortedSet.Builder<Portfolio> builder = ImmutableSortedSet.builder();

   for (Portfolio p : myMap.getValues()){
      builder.add(new Portfolio(p));
   }

   return builder.build();
}

Estoy usando guayaba ImmutableSortedSet aquí, pero podrías usar un SortedSet y trátelo como inmutable o use Collection.unmodificable ...

respondido 08 nov., 11:16

El problema es que necesito que los inversores estén ordenados por su Objeto de cartera, que tiene un Valor total en su interior, que es constante mientras compra / vende acciones.

El "cambio constante" es la parte complicada aquí.

AFAIK, no hay una estructura de datos eficiente (es decir, O (logN) o mejor rendimiento) que pueda mantener algo ordenado en un valor que cambia constantemente. Todas las API de mapas de propósito general con las que me he encontrado asumen que las claves no cambian mientras una asignación es un miembro del mapa.

Entonces, creo que tendrá que usar un mecanismo de eventos para rastrear eventos de "cambio de valor" para el Portfolio objeto. El controlador de eventos necesitaría eliminar atómicamente el Portafolio del mapeo ordenado, realizar el cambio y luego agregarlo nuevamente en la nueva posición.

Para implementar las estructuras de datos, necesita un par de mapas o un mapa bidireccional.

respondido 08 nov., 11:16

Por lo que sé, Java La biblioteca de colecciones no tiene una estructura de datos que se adapte a sus necesidades. Pero puedes usar TreeBidiMap en el objeto biblioteca de colección común

respondido 08 nov., 11:14

¿No tendría el TreeBidiMap que recurrir al árbol cada vez que cambiara un valor? ¿Es capaz de hacer esto? - Robert

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.