6
votes

Mettre en œuvre une interface de carte et de liste en Java?

J'aimerais avoir un objet qui implémente la carte et les interfaces de liste en Java. L'idée est similaire au problème dans cette question:


4 commentaires

Êtes-vous contre l'extension du LinkedHashMap , sinon, pourquoi ne pas essayer d'ajouter le obtenir (int) méthode?


Java.net/ Forum / Topic / JDK / Java-SE / ...


@Adam que ce lien est cassé, mais je suppose que nous savons ce que cela dit, juste de l'URL;)


Si votre carte est immuable et ne dispose pas de clés ou de valeurs nulles, GUAVA immutablablap peut être sauvé. C'est Keyset () de type immutableset qui offre aschiste () vue.


6 Réponses :


5
votes

LinkedHashMap fait ce que vous besoin.

Tableau de hachage et mise en œuvre de la liste liée de l'interface de la carte, avec ordre d'itération prévisible. Cette implémentation diffère de HASHMAP en ce sens qu'elle conserve une liste doublement liée à travers toutes ses entrées.


2 commentaires

Il n'y a pas de obtenir la méthode pour obtenir des éléments par index


@ADAM: Ensuite, étendez LinkedHashMap et implémentez GET (INT Index) à l'aide de l'itérateur. Vous pouvez même utiliser la matrice d'entrée de support [] appelée table (bien que j'utilise l'itérateur pour robustesse).



5
votes

Comme vous avez remarqué, vous ne pouvez pas implémenter à la fois et carte sur la même classe. Mais pour ce dont vous avez besoin, cela ne devrait pas non plus être nécessaire. Ce dont vous avez besoin, c'est que les données sont accessibles à la fois par une carte et une liste list . Un peu comme accéder à cartographique en tant que jeu dans entrée () ou en tant que collection utilisant carte.values ​​() .

En bref, ce dont vous avez besoin est de 2 vues sur les données, une vue d'implémentation d'une liste et d'une autre vue Implémentation de la carte . .

S'il y a un point de vue dominant (par exemple la carte), vous pouvez donner votre implémentation de carte une méthode liste getaslist () qui présente les données sous forme de liste, soutenue par les données de la carte.

Modifier

La réponse donnée par Paulo Gardedes devrait vous servir. Il existe déjà une mise en œuvre de la carte avec vos besoins. Ma réponse est un peu plus générale, à propos de présenter les mêmes données à l'aide de plusieurs interfaces incompatibles où un simple adaptateur ne suffit pas.


0 commentaires

1
votes

La carte carte et Les interfaces contiennent des interfaces conflictuelles d'un Supprimer méthode. Vous ne pouvez pas implémenter les deux dans une seule classe car vous ne pouvez pas remplacer la même signature de méthode avec une différence de type de retour uniquement.

Je me demande si vous utilisez Liste > remplirait votre besoin.


0 commentaires

6
votes

Il convient de souligner que la raison de l'erreur est que mappe contient la définition de la méthode suivante Supprimer : xxx

Tandis que list définit: xxx

et, en Java, des méthodes ne peuvent pas être surchargées en fonction de leur type de retour, de sorte qu'ils sont des signatures contradictoires et ne peuvent pas être mis en œuvre dans la même classe.


0 commentaires

2
votes

Pourquoi ne pas implémenter votre propre interface?

public interface HashListMap {

public boolean add(Object arg0);
public void add(int arg0, Object arg1);
public boolean addAll(Collection arg0);
public boolean addAll(int arg0, Collection arg1);
public void clear();
public boolean contains(Object arg0); 
public boolean containsAll(Collection arg0);
public Object get(int arg0);
public int indexOf(Object arg0);
public boolean isEmpty();
public Iterator iterator();
public int lastIndexOf(Object arg0);
public ListIterator listIterator();
public ListIterator listIterator(int arg0);
public boolean remove(Object arg0);
public Object remove(int arg0);
public boolean removeAll(Collection arg0);
public boolean retainAll(Collection arg0);
public Object set(int arg0, Object arg1);
public int size();
public List subList(int arg0, int arg1);
public Object[] toArray();
public Object[] toArray(Object[] arg0);
public boolean containsKey(Object arg0);
public boolean containsValue(Object arg0);
public Set entrySet();
public Object get(Object arg0);
public Set keySet();
public Object put(Object arg0, Object arg1);
public void putAll(Map arg0);
public Collection values();


1 commentaires

Très drôle :) Quel est le point d'utiliser une interface "jamais prise en charge"?



1
votes

En plus de ce que Dave Costa a dit que vous devriez utiliser LinkedHashMap. C'est la carte mais elle préserve l'ordre des éléments insertion.

comme carte qu'il implique la méthode des valeurs (), vous pouvez donc dire Nouvelle ArrayList (Carte.Values ​​()). Obtenez (0) à imiter la fonctionnalité de la liste.

Mais vous pouvez aussi dire map.get ("un") Parce que c'est juste une implémentation de carte.


0 commentaires