7
votes

Les limites supérieures des gammes indexées sont-elles toujours supposées être exclusives?

Donc, en Java, chaque fois qu'une plage indexée est donnée, la limite supérieure est presque toujours exclusive.

de java.lang.string :

SUBSTRING (INT BEGNEINDEX, INT ENDINDEX)

retourne une nouvelle chaîne qui est une sous-chaîne de cette chaîne. La sous-chaîne commence auprès du débutindex et s'étend sur le caractère à l'index endindex - 1

de java.util.arrays :

CopyOfrange (t [] original, int de, int to)

à partir de - l'index initial de la plage à copier, inclus) à - l'indice final de la plage à copier, exclusif.

de java.util.bitset :

SET (INT DEIDEX, INT TOINDEX)

fromindex - Index du premier bit à définir.
toindex - index après le dernier bit à définir.

Comme vous pouvez le constater, il ressemble à Java essaie de faire une convention cohérente que les limites supérieures sont exclusives.

Mes questions sont:

  • est-ce la recommandation faisant autorité officielle?
  • Y a-t-il des violations notables que nous devrions nous méfier?
  • Y a-t-il un nom pour ce système? (ALA "basé sur" basé sur "1 fois" ")

    Clarification: je comprends parfaitement qu'une collection d'objets N dans un système à 0 est indexé 0..n-1 . Ma question est que si une plage (2,4) donnée, il peut être 3 éléments ou 2, selon le système. Comment appelez-vous ces systèmes?

    Encore une fois, le problème n'est pas "premier index 0 dernier index n-1 " vs "premier index 1 dernier index N "système; c'est appelé le système basé sur VS 1 à 0.

    Le problème est "Il existe 3 éléments dans (2,4) " vs "Il existe 2 éléments dans (2,4) ". Que les appelez-vous et est-ce que l'un officiellement sanctionné sur l'autre?


2 commentaires

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?


6 Réponses :


2
votes

SON JUSTE 0 à N-1 Basé.

Une liste / une matrice contient 10 articles 0-9 indexé.

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 ...

C'est la manière typique des choses.

  1. oui .
  2. EXCELL GAMMES / FILES / CARKBOOKS.
  3. Index (technologie de l'information)

2 commentaires

Je comprends qu'une collection d'objets n 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 vous aider à cela. Plus susceptibles que non, il est basé, mais comme je l'ai mentionné, il y a des déviations ...



6
votes

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.

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 a [] qui est n éléments longs ont son dernier élément valide dans a [n-1] .

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 myList.Sublist (3, 7) , alors je reçois un subliste avec 7 - 3 = 4 éléments. Si la méthode SUBLIST () 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.

Ceci est particulièrement pratique lorsque l'index de démarrage est une variable: obtenir le subliste de MyList à partir de i c'est 5 éléments longs est juste myList.Sublist (i, i + 5) .

Tout ce qui est dit, vous devriez toujours 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.


2 commentaires

+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 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.)



0
votes

Cette pratique a été introduite par Josh Bloch à Collections API comme contrat.

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.


7 commentaires

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 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 , string , 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.



0
votes

Les index dans Tableau comme DataStructures sont vraiment toujours à base de données. La chaîne est fondamentalement soutenue par un char [] . 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.

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 "> Paretstatement 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.

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.


0 commentaires

3
votes

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 ".

J'ai compilé des discussions sur des gammes à moitié ouvertes vs fermées ailleurs:


SiliconBrain.com - 16 bonnes raisons d'utiliser des gammes semi-ouvertes (édité pour la concision ):

  • Le nombre d'éléments dans la plage [n, m) est juste mn (et pas m-n + 1 ). < / li>
  • La plage vide est [n, n) (et pas [n, n-1] , qui peut être un problème si n Est-ce qu'un itérateur pointe déjà le premier élément d'une liste ou si n == 0 ).
  • pour les flotteurs, vous pouvez écrire [13, 42) (au lieu de [13, 41.9999999999999] ).
  • Le +1 et -1 ne sont presque jamais utilisés, lors de la manipulation des gammes. C'est un avantage si ils sont chers (comme pour les dates).
  • Si vous écrivez une trouvaille dans une gamme, le fait qu'il n'y ait rien trouvé peut facilement indiqué en retournant la fin comme position trouvée: si (Recherche ([Début, fin)) == End) Rien trouvé.
  • Dans les langues, qui démarrent les indignes de matrice avec 0 (comme C, C ++, Java, NCL) La limite supérieure est égale à la taille.

    demi-ouverte par rapport à des gammes fermées < / p>

    Avantages des gammes demi-ouvertes:

    • Les gammes vides sont valides: [0. 0]
    • facile pour les subranges d'aller à la fin de l'original: [x .. $]
    • Ranges faciles à fragmenter: [0 .. x] et [x .. $]

      Avantages des gammes fermées:

      • symétrie.
      • sans doute plus facile à lire.
      • ['a' ... 'z'] ne nécessite pas d'awkward + 1 après 'z' . .
      • [0 ... uint.max] est possible.

        Ce dernier point est très intéressant. Il est vraiment difficile d'écrire un numéryisinrange (int N, int min, int max) prédicat avec une plage demi-ouverture si integer.max_value pourrait être légalement dans une plage. < / p>


0 commentaires

0
votes

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.


0 commentaires