Donc, en Java, chaque fois qu'une plage indexée est donnée, la limite supérieure est presque toujours exclusive. P>
de retourne une nouvelle chaîne qui est une sous-chaîne de cette chaîne. La sous-chaîne commence auprès du de de Comme vous pouvez le constater, il ressemble à Java essaie de faire une convention cohérente que les limites supérieures sont exclusives. P>
Mes questions sont: p>
Clarification: je comprends parfaitement qu'une collection d'objets Encore une fois, le problème n'est pas "premier index Le problème est "Il existe 3 éléments dans java.lang.string code>: p>
SUBSTRING (INT BEGNEINDEX, INT ENDINDEX) CODE>
P>
débutindex de code> et s'étend sur le caractère à l'index
endindex - 1 code> p> p>
blockQuote>
java.util.arrays code>: p>
CopyOfrange (t [] original, int de, int to) code> p>
à partir de code> - l'index initial de la plage à copier, inclus)
à code> - l'indice final de la plage à copier, exclusif. p>
blockQuote>
java.util.bitset code>: p>
SET (INT DEIDEX, INT TOINDEX) CODE>
P>
fromindex code> - Index du premier bit à définir.
toindex code> - index après le dernier bit à définir. p>
blockQuote>
N code> dans un système à 0 est indexé
0..n-1 code>. Ma question est que si une plage
(2,4) code> donnée, il peut être 3 éléments ou 2, selon le système. Comment appelez-vous ces systèmes? P>
0 code> dernier index
n-1 code>" vs "premier index
1 code> dernier index
N code> "système; c'est appelé le système basé sur VS 1 à 0. P>
(2,4) code>" vs "Il existe 2 éléments dans
(2,4) code>". Que les appelez-vous et est-ce que l'un officiellement sanctionné sur l'autre? P>
6 Réponses :
SON JUSTE Une liste / une matrice contient Vous ne pouvez pas avoir une liste basée sur 0 indexée qui est 0-N où la cout est n, qui comprend un élément qui n'existe pas ... P>
C'est la manière typique des choses. P>
Je comprends qu'une collection d'objets n code> dans un système à 0 est indexé 0..n-1. Ma question est que si une plage (2,4) donnée, est-ce que 3 articles ou 2?
Cela dépendra du contexte de la liste des objets que vous rapportez. Comme mentionné précédemment, la documentation devrait I> vous aider à cela. Plus susceptibles que non, il est basé, mais comme je l'ai mentionné, il y a des déviations ...
En général, oui. Si vous travaillez dans une langue avec la syntaxe C - C - C ++, Java), les tableaux sont des tableaux d'accès à zéro et la plupart des structures de données d'accès aléatoire (vecteurs, liste de réseau, etc.) vont être nulles également. p>
Indices de démarrage à zéro signifie que la taille de la structure de données sera toujours supérieure à celle de la dernière index valide de la structure de données. Les gens veulent souvent connaître la taille des choses, bien sûr, et il est donc plus pratique de parler de la taille que de parler du dernier index valide. les gens se sont habitués à parler d'indices de fin de manière exclusive, car un tableau Il existe un autre avantage à utiliser un indice exclusif pour l'indice de fin, à savoir que vous pouvez calculer la taille d'un subliste en soustrayant l'index de départ inclus de l'indice de fin exclusif. Si j'appelle Ceci est particulièrement pratique lorsque l'index de démarrage est une variable: obtenir le subliste de Tout ce qui est dit, vous devriez toujours em> lire la documentation de l'API, plutôt que de supposer qu'un indice de départ ou un index de fin de départ sera inclusif ou exclusif. De même, vous devez documenter votre propre code pour indiquer si toutes les limites sont inclusives ou exclusives. P> a [] code> qui est
n code> éléments longs ont son dernier élément valide dans
a [n-1] code>. em> p>
myList.Sublist (3, 7) code>, alors je reçois un subliste avec
7 - 3 = 4 code> éléments. Si la méthode
SUBLIST () CODE> avait utilisé des indices inclusifs pour les deux extrémités de la liste, je devrais ajouter un supplément de 1 pour calculer la taille du subliste. p>
MyList code> à partir de
i code> c'est 5 éléments longs est juste
myList.Sublist (i, i + 5) code>. p>
+1 pour "Vous devriez toujours lire la documentation de l'API" et "vous devez documenter votre propre code pour indiquer"
Juste pour clarifier la pertinence pour l'OP, je pense que la popularité des gammes à moitié ouvertes en Java est venue directement de l'utilisation de plages à moitié ouvertes en C, ce qui est à son tour constitué d'une extension naturelle de l'indexation à base de zéro. Je pense donc qu'une discussion sur l'indexation zéro est i> pertinente pour la question initiale. (Cela étant dit, c'est de ma faute si je ne faisais pas ce lien entre l'indexation zéro et les gammes demi-ouvertes explicites dans ma réponse originale.)
Cette pratique a été introduite par Josh Bloch à Collections API comme contrat. P>
Après cela, il est devenu une norme en Java et lorsque quelqu'un est dicide de créer une bibliothèque publique, il suppose qu'il devrait conserver le contrat car les utilisateurs s'attendent à voir un comportement déjà connu dans de nouvelles bibliothèques. P>
C'est donc le "système bloch", alors? Cela a sûrement besoin d'utilisation historique avant le cadre de collections Java / Java?
Je ne connais pas son nom et je ne suis pas sûr que cela existe. J'ai regardé une vidéo sur YouTube où Josh Bloch parlait de bons principes dans la conception de l'API. Et là-bas, il a dit que Inclusive Bombe inférieure et un principe limité supérieur exclusif i> est en fait une norme et ne devrait pas être jamais violée lorsque vous développez des bibliothèques publiques. Il a également mentionné qu'il était le premier (ou l'un des premiers, je ne me souviens pas) qui l'a présenté à Java.
Je suis confus pourquoi les gens vous ont baissé, parce que contrairement à certains des autres ici, vous «obtenez» ce que je demande.
Je ne suis pas le descendant ;-), mais je suis curieux d'où ce contrat est documenté. C'est un modèle qui est suivi systématiquement à travers les API de collections et, bien sûr, tout le monde l'a remarqué, mais je ne l'ai jamais vu nommé ni de manière centralisée. Quoi qu'il en soit, le modèle de passage de la taille d'un tableau ou d'une chaîne (qui est identique à l'indice de fin exclusif si l'index de démarrage est zéro) remonte à l'arrière avant Java, non?
@Je Carnahan: Je ne sais pas si c'est documenté n'importe où (mais si je ne le sais pas et que vous ne le savez pas, cela ne signifie pas que ce n'est pas documenté) mais chaque développeur Java moyen ou supérieur sait que cela Le principe ne devrait pas être violé si vous souhaitez que d'autres personnes utilisent votre produit. Apache Commons et Google Collections et de nombreuses autres bibliothèques (Google Data API par exemple) se conforment à ce contrat.
Théorie intéressante, mais la matrice en informatique et le vecteur code>,
string code>, etc dans l'API Java étaient déjà 0 basée sur la BLOCH.
@Balusc: Je ne pense pas que @PolyGenLubribuants accepte qu'il existe une connexion entre l'indexation zéro et la coutume d'utiliser des indices de fin exclusifs lors de la description des gammes. Je pensais que la connexion était claire (taille d'un tableau à base de zéro = indice de fin exclusif de cette matrice), mais apparemment cette connexion n'est pas aussi claire que vous et je pensais que c'était.
Les index dans Tableau comme strong> DataStructures sont vraiment toujours à base de données. La chaîne code> code> est fondamentalement soutenue par un Il existe toutefois des "exceptions", telles que les méthodes de réglage basées sur paramètreIndex "href =" http://java.sun.com/javase/6/docs/api/java/sql/preparedstatement.html "rel =" nofollow NOREFERRER "> Cela ferait probablement une nouvelle question: "Pourquoi les indices de tableau sont-ils zéro?". Maintenant, notre scientifique de programmation informatique respectée E.W. Dijkstra explique ici pourquoi il devrait Commencez avec zéro. p> char [] code>. Le cadre de collections est sous la hotte en fonction des tableaux et ainsi de suite. Cela permet de concevoir / de maintenir / à utiliser l'API plus facile sans modifier le moyen "sous-timonule" pour accéder à l'élément désiré (s) de la matrice. p>
Paretstatement code> et les méthodes de getter basées sur ColuminIdex de
Resultats (code>
. Ils sont basés sur 1. Dans les coulisses, ils ne représentent pas non plus vraiment un éventail de valeurs. P>
Le crédit va à Fredoverflow dans son commentaire indiquant que cela s'appelle la "plage de demi-ouverture". Donc, probablement, les collections Java peuvent être décrites comme " à base de 0 avec des gammes demi-ouvertes em>". P>
J'ai compilé des discussions sur des gammes à moitié ouvertes vs fermées ailleurs: p>
SiliconBrain.com - 16 bonnes raisons d'utiliser des gammes semi-ouvertes (édité pour la concision ): p>
demi-ouverte par rapport à des gammes fermées < / p>
Avantages des gammes demi-ouvertes: P>
Avantages des gammes fermées: p>
Ce dernier point est très intéressant. Il est vraiment difficile d'écrire un
[n, m) code> est juste
mn code> (et pas
m-n + 1 code>). < / li>
[n, n) code> (et pas
[n, n-1] code>, qui peut être un problème si
n code > Est-ce qu'un itérateur pointe déjà le premier élément d'une liste ou si
n == 0 code>). li>
[13, 42) code> (au lieu de
[13, 41.9999999999999] li>). LI>
+1 code> et
-1 code> ne sont presque jamais utilisés, lors de la manipulation des gammes. C'est un avantage si ils sont chers (comme pour les dates). Li>
si (Recherche ([Début, fin)) == End) Code> Rien trouvé. Li>
[0. 0] code> li>
[x .. $] code> li>
[0 .. x] code> et
[x .. $] code> li>
ul>
['a' ... 'z'] code> ne nécessite pas d'awkward
+ 1 code> après
'z' code>. li>.
[0 ... uint.max] code> est possible. strong> li>
ul>
blockQuote>
numéryisinrange (int N, int min, int max) code> prédicat avec une plage demi-ouverture si
integer.max_value code> pourrait être légalement dans une plage. < / p>
Le moyen facile de penser à des gammes semi-ouvertes est la suivante: le premier terme identifie le début des éléments dans la plage et le second terme identifie le début des éléments après la plage. Gardez cela à l'esprit, et tout fait beaucoup plus de sens. De plus, l'arithmétique fonctionne mieux dans de nombreux cas, par réponse @polygenLubants. P>
C'est ce qu'on appelle une plage demi-ouverte.
Ah oui, j'ai entendu ce terme auparavant. Donc, vous diriez que les collections de Java sont "à base de 0 avec des gammes demi-ouvertes", alors?