248 votes

Pourquoi ne pas java.util.Mis en get(int index)?

Je suis sûr qu'il y a une bonne raison, mais quelqu'un pourrait-il expliquer pourquoi le java.util.L'interface manque get(int Index), ou de toute autre méthode get ()?

Il semble que les jeux sont parfaits pour mettre les choses, mais je ne peux pas trouver un moyen élégant de récupérer un élément de celui-ci.

Si je sais que je veux le premier élément, je peux utiliser.iterator().next(), mais sinon, il semble que j'ai cast vers un Tableau pour récupérer un élément à un index spécifique?

Quels sont les moyens appropriés de la récupération de données à partir d'un jeu? (autres qu'à l'aide d'un itérateur)

Je suis sûr que le fait qu'il est exclu de l'API signifie qu'il y a une bonne raison pour ne pas le faire -- quelqu'un pourrait-il svp m'éclairer?

EDIT: Quelques très excellentes réponses ici, et un peu de dire "dans le contexte". Spécifiques scneario était un dbUnit test, où j'ai pu reasonalby affirmer que le retour de l'ensemble à partir d'une requête avait seulement 1 point, et j'ai essayé d'accéder à cet élément.

Cependant, la question est plus valide sans scénario, car il reste plus concentré : Quelle est la différence entre le jeu et la liste.

Merci à tous pour ce fantastique réponses ci-dessous.

184voto

Michael Myers Points 82361

Parce que les jeux ont aucune commande. Certaines implémentations ne (particulièrement ceux de la mise en œuvre de l' java.util.SortedSet interface), mais ce n'est pas une propriété générale de jeux.

Si vous essayez d'utiliser des ensembles de cette façon, vous devriez envisager d'utiliser une liste à la place.

79voto

Sorin Postelnicu Points 565

Effectivement, c'est une question récurrente lors de l'écriture de toutes les applications JavaEE qui utilisent de Mapping Objet-Relationnel (par exemple avec la mise en veille); et de toutes les personnes qui ont répondu ici, Andreas Petersson est le seul qui a compris le problème et a offert la réponse correcte: Java est manquant un UniqueList! (ou vous pouvez aussi l'appeler OrderedSet, ou IndexedSet).

Maxwing mentionné ce cas d'utilisation (dans lequel vous avez besoin d'ordonné ET de données unique) et il a suggéré que le SortedSet, mais ce n'est pas ce que Marty Pitt vraiment nécessaire.

Cette "IndexedSet" n'est PAS la même chose qu'un SortedSet - dans un SortedSet les éléments sont triés à l'aide d'un Comparateur (ou à l'aide de leur "naturel" de la commande).

Mais au lieu de cela il se rapproche plus d'un LinkedHashSet (que d'autres également suggéré), ou même plus d'un (également inexistante) "ArrayListSet", parce qu'il garantit que les éléments sont retournés dans le même ordre qu'ils ont été insérés.

Mais le LinkedHashSet est une implémentation d'une interface! Qu'est-ce que vous avez besoin est un IndexedSet (ou ListSet, ou OrderedSet, ou UniqueList) de l'interface! Cela va permettre au programmeur de spécifier qu'il a besoin d'un ensemble d'éléments qui ont un ordre précis et sans doublons, et ensuite l'instancier avec toute la mise en œuvre (par exemple une mise en œuvre d'Hibernate).

Depuis le JDK est open-source, peut-être que cette interface sera finalement inclus dans Java 7...

29voto

Jonik Points 18905

Juste ajouter un point qui n'était pas mentionné dans mmyers de réponse.

Si je sais que je veux le premier élément, je peux l'utilisation de set.iterator().next(), mais sinon, il semble avoir à jeter à un Tableau pour récupérer un élément à un index spécifique?

Quels sont les moyens appropriés de la récupération de données à partir d'un jeu? (d'autres que l'utilisation d'un itérateur)

Vous devez également vous familiariser avec l' SortedSet interface (dont la plus commune de mise en œuvre est - TreeSet).

Un SortedSet est un Ensemble (c'est à dire les éléments sont uniques) qui est maintenue commandé par l' ordre naturel des éléments ou de l'utilisation de certains Comparator. Vous pouvez facilement accéder à la première et la dernière éléments à l'aide d' first() et last() méthodes. Un SortedSet est très pratique à chaque fois dans un certain temps, lorsque vous avez besoin de garder votre collection, sans doublon et d'une commande d'une certaine manière.

Edit: Si vous avez besoin d'un Ensemble dont les éléments sont conservés dans l'insertion d'ordre (un peu comme une Liste), prendre un coup d'oeil à l' LinkedHashSet.

27voto

waxwing Points 10190

Ce type de conduit à la question de savoir quand vous devez utiliser un jeu et quand vous devriez utiliser une liste. Généralement, les conseils se passe:

  1. Si vous avez besoin de tri des données, utiliser une liste
  2. Si vous avez besoin de données unique, l'utilisation d'un ensemble
  3. Si vous avez besoin, utilisez un ensemble trié

Un quatrième cas qui apparaît souvent, c'est que vous n'avez ni besoin. Dans ce cas, vous voyez que certains programmeurs aller avec des listes et d'autres avec des jeux. Personnellement, je trouve qu'il est très nocif pour voir l'ensemble comme une liste sans commande - parce que c'est vraiment une toute autre bête. Sauf si vous avez besoin des choses comme ensemble d'unicité ou de définir l'égalité, toujours en faveur des listes.

20voto

skiphoppy Points 16563

Je ne suis pas sûr si quelqu'un a orthographié exactement de cette façon, mais vous devez comprendre les éléments suivants:

Il n'y a pas de "premier" élément dans un ensemble.

Parce que, comme d'autres l'ont dit, les jeux ont aucune commande. Un jeu est un concept mathématique qui précisément ne comprend pas la commande.

Bien sûr, votre ordinateur ne peut pas vraiment en tenir une liste de choses qui n'est pas ordonné dans la mémoire. Il doit avoir une commande. En interne, c'est un tableau ou une liste, ou quelque chose. Mais vous ne savez pas vraiment ce que c'est, et il n'a pas vraiment d'avoir un premier élément; l'élément qui sort du "premier" est ce que ça par hasard, et pourrait ne pas être le premier à la prochaine fois. Même si vous avez pris des mesures pour "garantir" un particulier premier élément, c'est encore par hasard, parce que vous venez arrivé à trouver la bonne formule pour un particulier de la mise en œuvre d'un Ensemble, d'une autre application peut ne pas fonctionner de cette façon, avec ce que vous avez fait. Et, en fait, vous ne pouvez pas savoir l'application que vous utilisez ainsi que vous pensez que vous faites.

Les gens courent dans TOUT cela. L'. TEMPS. avec les systèmes SGBDR et de ne pas comprendre. Un SGBDR requête renvoie un jeu d'enregistrements. C'est le même type d'ensemble des mathématiques: une collection non ordonnée d'éléments, seulement dans ce cas, les éléments sont des enregistrements. Un SGBDR résultat de la requête n'a pas d'ordre garanti à tous sauf si vous utilisez la clause ORDER BY, mais tout le temps des gens supposent qu'il n', puis voyage eux-mêmes un jour, même si la forme de leurs données ou de code change légèrement et déclenche l'optimiseur de requête de travailler d'une manière différente et du coup, les résultats ne viennent pas dans l'ordre qu'ils attendent. Ce sont généralement les gens qui n'ont pas l'attention dans la classe de base de données (ou lors de la lecture de la documentation ou des tutoriels) quand il a été expliqué, à l'avant, que les résultats de la requête ne sont pas assurés de la commande.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X