2010-11-10 3 views
2

Donc voici le problème auquel je suis confronté, j'essaye d'implémenter un HashMap en utilisant un Id comme clé, et un pointeur d'objet comme valeur.Java: Cache trié multi-indexé ou SortedMap avec accès à l'index

Dans chaque objet, il y a deux entiers, disons qu'ils représentent des montants d'investissement dans diverses catégories définies dans l'objet.

Cependant, j'aimerais pouvoir trier le montant de l'investissement dans une catégorie particulière et accéder au Nième élément, tout en accédant à la clé et à l'objet. Il doit donc être indexé par chaque montant d'investissement.

Exemple:
Id = 1, objet: {gaz = 2000, Tech = 5000, Banque = 1000}
Id = 2, objet: {gaz = 1000, Tech = 8000, Banque = 2000}
Id = 3, Objet: {Gaz = 4000, Tech = 6000, Banque = 3000}

Donc, je veux être capable de faire des recherches par ID à l'objet (facile). Mais je veux aussi être en mesure de faire quelque chose comme Gas [0] pour obtenir le meilleur investissement pour le gaz (Id = 3), Tech [2] pour obtenir le troisième investissement le plus élevé pour la technologie (Id = 1).

Quel type de structure de données devrait être utilisé pour quelque chose comme ça?

Répondre

2

Vous pouvez utiliser un java.util.SortedSe t avec un Comparator personnalisé pour chaque index supplémentaire souhaité.

Map<Integer, MyClass> byId = new HashMap<Integer, MyClass>(); 
SortedSet<MyClass> byGas = new TreeSet<MyClass>(new MyGasComparator()); 
SortedSet<MyClass> byTech = new TreeSet<MyClass>(new MyTechComparator()); 
... 

class MyGasComparator implements Comparator<MyClass> { 
    @override 
    public int compare(MyClass a, MyClass b) { 
     int r = a.getGas() - b.getGas(); 
     if (r != 0) { 
      return r; 
     } 

     // gas is equal, ensure fixed order 
     return a.getId() - b.getId(); 
    } 
} 

... 

Avec le comparateur ci-dessus, byGas().first() sera l'objet avec la plus grande valeur du gaz, et les deux byGas.iterator() et byGas.toArray() renverra les objets commandés par le gaz dans l'ordre décroissant. Il suffit d'inverser a et b dans le comparateur pour inverser la commande.

En outre, envisagez d'encapsuler les mappes d'index dans une autre classe chargée d'ajouter, de supprimer et de rechercher des valeurs pour les différents types d'index.