2010-04-06 6 views
1

Je travaille actuellement dur pour une mission en retard. Je suis censé faire une liste chaînée en utilisant des génériques. Ou, j'ai une interface appelée Créature que la liste est censée trier. Mais comment? Comment la liste peut-elle trier les créatures lorsque l'interface ne peut pas avoir un pointeur CreatCreateCreature? Je sais de faire une liste liée en utilisant des objets normaux, mais ce truc générique m'a dérouté.Création d'une liste chaînée à l'aide des génériques

Ceci est seulement une très petite partie de la tâche, mais je n'arrive à rien à cause de cela.

+1

Vous feriez mieux de fournir le texte de l'assignation telle quelle, car ce que vous nous demandez n'est pas clair. –

Répondre

0
public interface Creature { 
    public void doSomething(); 
} 

public class MyCreature implements Creature { 
    public void doSomething() { } 
} 

et que vous utilisez dans votre code comme ceci:

List<Creature> genericList = new LinkedList<Creature>(); 
genericList.add(new MyCreature()); 
Creature c = genericList.get(0); 
+0

Je pense qu'il est supposé définir sa propre classe LinkedList. Ou j'ai mal compris la question. – sepp2k

+0

Hm ... peut-être avez-vous raison. Faire un LinkedList générique comme une cession peut être un peu facile. Encore possible, cependant :-). – pajton

3

Une classe de liste chaînée générique est généralement mis en œuvre en utilisant une classe d'aide générique pour représenter un noeud de la liste. Cette classe de nœud contiendrait un élément de type T (où T est le paramètre générique) et une référence au nœud suivant (de type Node<T>). Cela ressemblerait donc à ceci:

class Node<T> { 
    T element; 
    Node<T> next; 
}; 

Dans le cas d'une liste doublement chaînée, le nœud contiendrait également une référence au nœud précédent. En utilisant cette classe de nœuds, vous devriez être capable de définir votre implémentation de liste chaînée (la liste contiendrait simplement une référence au premier nœud (et au dernier nœud pour les listes doublement chaînées), puis définirait les opérations de listage en opérant sur le nœuds).

1

Le tri est gérée automatiquement tant que vous implémentez Comparable:

class Creature implements Comparable { 
    public int compareTo(Object o) { 
     return 0; // TODO: Your compare function here. 
    } 
} 

class Ape extends Creature {} 
class Elephant extends Creature {} 

Ensuite, vous pouvez créer une liste générique et trier comme tel:

public static void main(String[] args) { 
    LinkedList<Creature> creatures = new LinkedList<Creature>(); 
    Collections.addAll(creatures, new Elephant(), new Ape()); 
    Collections.sort(creatures); 
} 
+0

Merci pour la réponse rapide! Mais nous devons faire la liste liée à partir de zéro. – Confused

+0

Pas de problème. Je suggère de regarder le code source de java.util.LinkedList comme un excellent exemple d'implémentation. – Frederik

3

Votre problème est que vous pensez coincé chaque objet dans une liste liée doit pointer vers l'objet suivant (et éventuellement précédent). Ce n'est pas tout à fait correct. Ce que vous devez faire est de construire une liste chaînée d'objets qui ne contiennent que d'autres objets. Ainsi, au lieu d'essayer de comprendre comment modifier la créature afin qu'elle ait des pointeurs, il suffit de créer une liste chaînée d'objets génériques ListEntry, dont chacun a une ou plusieurs références à d'autres ListEntrys et qui peut également contenir des éléments à spécifier (génériques) De l'extérieur, il agira comme si chaque créature avait des références aux autres, mais de l'intérieur vous saurez que chaque créature est juste portée par un objet ListEntry. C'est l'une des choses qu'ils veulent dire lorsqu'ils parlent d'encapsulation. Par ailleurs, c'est comme cela que cela se fait dans le framework Collections Java.