2010-04-02 3 views
7

Un de mes amis est venu à moi avec ce comportement étrange que je ne peux pas expliquer, une vue de perspicacité serait appréciée.La méthode IndexOf renvoie 0 quand il devrait avoir le retour -1 en C#/Java

Im en cours d'exécution VS 2005 (C# 2.0), le code suivant montre le comportement

int rr = "test".IndexOf(""); 
Console.WriteLine(rr.ToString()); 

le code ci-dessus, l'impression "0" qui montrent clairement qu'il devrait avoir le retour -1

Cela aussi se produire en Java où la classe suivante montre le comportement:

public class Test{ 
public static void main(String[] args){ 
    System.out.println("Result->"+("test".indexOf(""))); 
} 
} 

Im fonctionnement Java 1.6.0_17

+0

en double de http://stackoverflow.com/questions/3872936/why-do-strings-start-with-a-in-java et http://stackoverflow.com/questions/145509/why- does-abcd-startswith-return-true –

Répondre

10

Ceci n'est pas une exception à la règle, mais plutôt une conséquence naturelle de la définition de indexOf et startsWith. Vous prétendez que "test".indexOf("") doit renvoyer -1. Ceci est essentiellement équivalent à l'affirmation selon laquelle "test".startsWith("") devrait renvoyer false. Pourquoi est-ce?Bien que ce cas soit spécifiquement traité dans la documentation comme renvoyant true, il ne s'agit pas d'une décision arbitraire.

Comment décideriez-vous "test".startsWith("te"), par exemple? Le plus simple est d'utiliser la récursivité. Comme les deux chaînes commencent par le caractère 't', vous appelez "est".startsWith("e") et renvoyez le résultat. De même, vous appelez "st".startsWith("") et renvoyez le résultat. Mais vous savez déjà que la réponse devrait être true, c'est pourquoi chaque chaîne commence par "".

+0

@jleedev bonne explication merci – jcgarciam

10

0 est correct. Commencer à la position zéro et peut (trivialement) correspondre à une chaîne de longueur nulle. De même, "" contient "".

+0

ce serait bien si cela aurait été mon exemple, j'ai essayé: "Test" .IndexOf (""); ce qui est différent de ce que vous expliquez. – jcgarciam

+0

@jcgarciam pas vraiment. Vois-le de cette façon; de quelle manière ** ne ** commence-t-il pas par (ou ne contient-il pas) "". Montre-moi le personnage qui ne correspond pas. Il n'y en a pas, donc c'est un match. –

21

Citation du C# documentation:

Si la valeur est Empty, la valeur de retour est 0.

Le comportement que vous décrivez est tout à fait comme prévu (au moins en C#).

+0

Merci de l'avoir signalé pour C# (Donc, cela semble une exception à la règle). Sur sa contre-partie (JavaDoc), n'est pas bien expliqué que ce comportement sera attendu. – jcgarciam

+0

@jcgarciam: bon point; Je mettrai à jour la réponse en indiquant qu'elle est liée à C#. –

6

0 est correct. Les Javadocs soulignent que indexOf fonctionne comme suit:

L'entier retourné est la plus petite valeur k tel que:

this.startsWith(str, k) 

Toute chaîne commençant par "" est égale à la chaîne d'origine (et chaque chaîne commence par ""), donc le plus petit k pour str = "" est toujours 0.

+0

Désolé, mais je ne comprends pas votre raisonnement à ce sujet. – jcgarciam

+4

* Chaque chaîne * commence par "" De même, chaque ensemble est un surensemble d'un ensemble vide. Etc ... C'est une convention très pratique. – glebm

+0

Merci de l'avoir signalé @glebm – jcgarciam

2

Il devrait retourner 0. Vous sont à la recherche de la première occurrence d'une chaîne vide, non? :)

3

Pensez-y de cette façon: IndexOf, quand vous cherchez une chaîne, commencera à la position 0, essayera de faire correspondre la chaîne, si elle ne rentre pas, passera à la position 1, 2, etc. vous l'appelez avec une chaîne vide, il tente de faire correspondre la chaîne vide avec la chaîne commençant à la position 0 avec la longueur 0. Et hourra, rien ne vaut rien. Remarque: Il n'y a pas de raison valable d'utiliser ToString lorsque vous utilisez Console.Write/WriteLine. La fonction appelle automatiquement la méthode ToString de l'objet en question. (À moins de surcharger ToString)

+0

A la position d'index 0, "test" ne contient pas "rien" il a un "t". Voté +1 pour la façon dont vous l'avez mis. :) –

+0

comme sonnerie dit, à la position 0 il ne détient pas "rien". Mais merci quand même! Il semble que cela soit expliqué dans la documentation. Je vais mettre cela comme une exception à la règle de la façon dont IndexOf est supposé fonctionner. – jcgarciam

1

Juste pour le plaisir. Cela fonctionne aussi comme ça en python

>>> "test".startswith("") 
True 
>>> "test".index("") 
0 

Python lance une ValueError au lieu de -1 qui est sympa.

>>> "test".index('r') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: substring not found 
1

Plus de plaisir php fait un travail bien meilleur!

php -r "print strpos('test','');" 
PHP Warning: strpos(): Empty delimiter. in Command line code on line 1 
Questions connexes